在Activity已啓動的時候獲取View的寬高
今天在寫一個業務的時候需要在onCreate中獲取View的寬高,但是獲取出來卻是0,這是爲什麼呢?
這是因爲View的measure過程和Activity的生命週期方法不是同步執行的
因此無法保證Activity執行了onCreate,onStart,onResume時某個VIew已經測量完畢,如果此時View沒有測量完畢,那麼獲得的寬高會是0
查了一下資料,提供以下解決辦法:
1.onWindowFocusChanged
/**
* 含義:View已經初始化完畢,寬高已經準備好了
* 此方法會被調用多次,當Activity失去/得到焦點的時候均會被調用
* @param hasFocus
*/
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
}
2. view.post()
/**
* 通過post將一個Runnable投遞到消息隊列尾部,然後等待Looper調用此Runnable的時候,View已經初始化好了
*/
view.post(new Runnable() {
@Override
public void run() {
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
});
3.view.getViewTreeObserver()
@Override
protected void onStart() {
super.onStart();
/**
* 使用ViewTreeObserver的很多方法也可以完成這個功能,eg如下
* 當View樹的狀態發生變化的時候或者View樹中的View的可見性發生變化的時候,回調的方法。此時可以獲取View的寬高
*/
ViewTreeObserver observer = view.getViewTreeObserver();
observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//調用一次之後就移除監聽
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
});
}