FBI Warning:歡迎轉載,但請標明出處:http://blog.csdn.net/codezjx/article/details/45341309,未經本人同意請勿用於商業用途,感謝支持!
當我們在onCreate()回調方法中去調用View的getWidth()、getHeight()、getTop()、getLeft()等方法的時候,是無法獲取到正確值的,此時只會返回0。
爲什麼呢?
因爲View的顯示必須經歷Measure(測量)、Layout(佈局)和Draw(繪製)過程。而在Measure與Layout過程完成之後,View的width、height、top、left等屬性才被正確賦值,此時我們才能獲取到正確的值,這幾個過程都晚於onCreate執行。
解決方法一:用View.post()一個runnable就可以了:
view.post(new Runnable() {
@Override
public void run() {
view.getHeight();
}
});
(UI線程消息隊列會按順序處理事件,在setContentView()被調用後,消息隊列中會包含一個要求重新Layout的msg,所以任何你post到UI線程隊列中的東西都會在Layout後執行。)解決方法二:重寫Activity的onWindowFocusChanged方法
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//此處可以正常獲取width、height等
}
(說明:在Activity得到或者失去焦點的時候,就會被調用。Activity初始化完畢準備顯示的時候就會回調該方法。所以說,只要想做一些Activity加載完畢就馬上觸發的事情,都可以在這裏執行。)
解決方法三:爲View註冊監聽器OnGlobalLayoutListener
mView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//此處可以正常獲取width、height等
mView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
(說明:視圖樹的可視性或全局佈局狀態發生變化時執行的回調函數,此時已經完成Layout過程,可能會被多次調用,所以獲取完後就可以移除監聽器)