简述在Activity启动的时候获得View宽高的方式 ?

在 Android 开发中,直接在 ActivityonCreate() 方法中获取视图(View)的宽高往往是不可行的,因为视图的布局尚未完成,所以无法正确获取到尺寸信息。下面介绍几种在 Activity 启动时获取视图宽高的有效方式:

  1. 使用 View 的 post() 方法

这是获取视图尺寸最简单也是最常用的方法。post() 方法会将一个 Runnable 对象排队到消息队列的末尾,等待 View 完成布局后执行。

final View view = findViewById(R.id.my_view);
view.post(new Runnable() {
    @Override
    public void run() {
        int width = view.getWidth();
        int height = view.getHeight();
        // 使用视图的宽和高
    }
});
  1. 使用 ViewTreeObserver

如果你需要在视图布局完成前进行更多的控制或监听,可以使用 ViewTreeObserver。这个类提供了一系列的回调,例如在布局完成后,在视图的大小发生改变时等。

final View view = findViewById(R.id.my_view);
ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // 为避免重复调用,移除监听器
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            view.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }

        int width = view.getWidth();
        int height = view.getHeight();
        // 使用视图的宽和高
    }
});
  1. 使用 OnLayoutChangeListener

如果你只关心视图的尺寸变化,可以为视图添加一个布局改变监听器。这种方式不需要关注整个视图树,代码更简洁。

final View view = findViewById(R.id.my_view);
view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
    @Override
    public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
        view.removeOnLayoutChangeListener(this);
        int width = view.getWidth();
        int height = view.getHeight();
        // 使用视图的宽和高
    }
});

总结

以上三种方法各有特点,适用于不同的场景:

  • post() 方法简单方便,适合大多数情况。
  • ViewTreeObserver 提供了更多的控制,但需要注意移除监听器,避免内存泄漏。
  • OnLayoutChangeListener 适用于视图布局变化时需要做出响应的场景。

根据你的具体需求选择合适的方法来获取视图的尺寸。

发表评论

后才能评论