有时候,我们需要在activity启动的时候获取view的宽高,但很多时候在onStart()或onRsume()中获取的都是0,这是view的measure过程与activity的生命周期不是同步的,所以当没有测量完成,返回的都是0。那要怎么获取呢?
1. onWindowFocusChanges
调用这个方法时那说明view已经初始化完毕,宽高已经赋值啦。但是这方法会被调用多次,如获取焦点与失去,activity暂停与恢复等都会被调用。
public void onWindowFocusChanged(boolean focus){
super.onWindowFocusChanged(focus);
if(focus){
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
}
2. view.post(runnable)
通过post一个runnable到信息列队尾部,当调用此方法时view已经初始化好了。
protected void onStart() {
super.onStart();
view.post(newRunnable() {
public void run() {
int width =view.getMeasuredWidth();
int height =view.getMeasuredHeight();
}
});
}
3.ViewTreeObserver
使用ViewTreeObserver的OnGlobalLayotListener接口可以获取宽高,但是OnGlobalLayoutListener接口中的onGlobalLayout会被调用多次。
ViewTreeObserver observer= view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@RequiresApi(api= Build.VERSION_CODES.JELLY_BEAN)
@Override
public voidonGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int width =view.getMeasuredWidth();
int height =view.getMeasuredHeight();
}
});