onCreate中View的width,height爲0的問題

FBI Warning:歡迎轉載,但請標明出處:http://blog.csdn.net/codezjx/article/details/45341309,未經本人同意請勿用於商業用途,感謝支持!


當我們在onCreate()回調方法中去調用ViewgetWidth()、getHeight()getTop()getLeft()等方法的時候,是無法獲取到正確值的,此時只會返回0

 

爲什麼呢?

因爲View的顯示必須經歷Measure(測量)、Layout(佈局)和Draw(繪製)過程。而在MeasureLayout過程完成之後,Viewwidth、heighttopleft等屬性才被正確賦值,此時我們才能獲取到正確的值,這幾個過程都晚於onCreate執行。

 

解決方法一:用View.post()一個runnable就可以了:

view.post(new Runnable() {
	@Override
	public void run() {
		view.getHeight();
	}
});
(UI線程消息隊列會按順序處理事件,在setContentView()被調用後,消息隊列中會包含一個要求重新Layout的msg,所以任何你post到UI線程隊列中的東西都會在Layout後執行。


解決方法二:重寫ActivityonWindowFocusChanged方法

@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過程,可能會被多次調用,所以獲取完後就可以移除監聽器)

 

 

發佈了48 篇原創文章 · 獲贊 66 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章