Android中獲取View寬高的最佳方法
作者:Reathin
使用?ViewTreeObserver?和?OnGlobalLayoutListener」這是獲取控件最終寬高的可靠方法。可以通過給控件添加一個ViewTreeObserver并注冊一個OnGlobalLayoutListener來監聽控件的全局布局變化。
在Android中,獲取View的寬高通常有多種方法,Android的視圖布局和測量是異步進行的,在某些生命周期階段,控件的寬高可能還未確定。以下是獲取控件寬高的幾種常用方法:
- 「重寫onMeasure方法」如果是自定義View類,可以在onMeasure方法中獲取到控件的寬高。注意onMeasure方法是在測量階段調用的,此時控件的寬高值可能已經通過父控件的布局參數設置或measureSpec確定。
- 「使用getMeasuredWidth()和getMeasuredHeight()」這兩個方法返回的是控件在測量階段確定的寬高值。如果控件尚未經過測量(例如,在onCreate方法中直接調用),返回的值可能是0。
- 「使用getWidth()和getHeight()」這兩個方法返回的是控件在布局階段確定的最終寬高值。如果在布局階段之前(例如在onCreate方法中)調用,也可能返回0。
- 「使用ViewTreeObserver和OnGlobalLayoutListener」這是獲取控件最終寬高的可靠方法。可以通過給控件添加一個ViewTreeObserver并注冊一個OnGlobalLayoutListener來監聽控件的全局布局變化。當控件的布局完成后,OnGlobalLayoutListener的onGlobalLayout方法會被調用,此時可以安全地獲取控件的寬高。
示例代碼:
View view = findViewById(R.id.view);
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
int width = view.getWidth();
int height = view.getHeight();
}
});
- 「使用post方法」post方法將一個Runnable對象排隊到主線程的執行隊列中,在控件的繪制階段之后執行。通常用于在控件的布局和繪制完成后執行某些操作,可以通過post方法來延遲獲取控件的寬高。
示例代碼:
View view = findViewById(R.id.view);
view.post(new Runnable() {
@Override
public void run() {
int width = view.getWidth();
int height = view.getHeight();
}
});
- 「使用View.LayoutParams」在某些情況下,可以通過檢查控件的LayoutParams來預測其可能的寬高。通常只適用于那些使用固定尺寸(如WRAP_CONTENT或MATCH_PARENT)或具體尺寸(如dp或px值)的控件。此方式不能保證獲取到的是控件的最終寬高。
- 「使用onWindowFocusChanged」方法會被調用多次,在View初始化完畢后會調用,當Activity的窗口得到焦點和失去焦點都會被調用一次(例如在Activity onResume時)。
示例代碼:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
}
}
在嘗試獲取控件的寬高時,應該考慮控件的生命周期和布局流程,確保在正確的時機獲取到正確的值。
責任編輯:武曉燕
來源:
沐雨花飛蝶