在Activity已啓動的時候獲取View的寬高

在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();
        }
    });
}
發佈了27 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章