简述在Activity启动的时候获得View宽高的方式 ?
在 Android 开发中,直接在 Activity
的 onCreate()
方法中获取视图(View
)的宽高往往是不可行的,因为视图的布局尚未完成,所以无法正确获取到尺寸信息。下面介绍几种在 Activity
启动时获取视图宽高的有效方式:
- 使用 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();
// 使用视图的宽和高
}
});
- 使用
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();
// 使用视图的宽和高
}
});
- 使用
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
适用于视图布局变化时需要做出响应的场景。
根据你的具体需求选择合适的方法来获取视图的尺寸。