首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ImageView getWidth/getHeight 返回 0?視圖未佈局完成

     編輯:程式設計綜合問答

問題現象

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv = findViewById(R.id.iv);
    System.out.println(iv.getWidth() + "------" + iv.getHeight()); // 輸出 0 0
}

根因

onCreate 時視圖尚未經歷 measure -> layout -> draw 流程,寬高為 0。 只有佈局完成後才能獲取實際尺寸。

解決方案

方案一:ViewTreeObserver.OnGlobalLayoutListener (推薦)

iv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // 移除監聽,避免重複回調
        iv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        int w = iv.getWidth();
        int h = iv.getHeight();
        // 此處 w/h 已有效
    }
});

方案二:view.post(Runnable)

iv.post(new Runnable() {
    @Override
    public void run() {
        int w = iv.getWidth();
        int h = iv.getHeight();
    }
});

原理:將 Runnable 投遞到 UI 線程消息隊列末尾,待佈局遍歷完成後執行。

方案三:onWindowFocusChanged (Activity 級)

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        int w = iv.getWidth(); // 此時確保已佈局
    }
}

對比與建議

方案優點缺點
OnGlobalLayoutListener精確針對該 View,佈局完成即回調API 16+ 需用 removeOnGlobalLayoutListener
view.post代碼極簡,無版本兼容問題非精確佈局完成,只是「稍後執行」
onWindowFocusChanged適用多 View 統一獲取Activity 生命週期耦合,可能多次觸發

總結

**onCreate 獲取寬高必為 0**。用 view.post() 最簡潔通用;精確控制用 OnGlobalLayoutListener。切記移除監聽防洩漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved