我最初的問題是需要知道我的根的高度和寬度View
,以便我可以進行程序化佈局更改。出於我的目的,我不一定需要在onCreate()
期間確定這些信息;對於我來說編程添加我的孩子View
s已足夠了,因此我很樂意使用onWindowFocusChanged()
作爲掛鉤來確定何時調用根View
的getWidth()
和getHeight()
將返回有效結果。View.post(),當Runnables被執行
但是,我看到不少人在onCreate()
期間詢問如何確定根View
的大小。我猜人們希望這樣做以獲得更好的用戶體驗 - 也許這樣用戶就不會看到分階段構建的佈局(如果有人可以澄清原因,我會很感激的)。現在,我經常看到的答案如here,是在onCreate()
內發佈Runnable
到根View
。在Runnable
的內部,我們執行getWidth()
等。之所以這樣工作,是因爲當View
具有佈局和/或附加到窗口時,顯然Runnable
張貼到View
的對象被執行。
這使我想到我的問題。在View
的API文檔中,似乎沒有描述這種行爲。那麼,誰能告訴我它在哪裏定義和記錄?或者,這是檢查來源的問題嗎?它是一個絕對的和嚴格定義的特徵,Runnables
將留在View
的隊列中,只能在佈局過程後的某個點處理?
進一步澄清:在閱讀克里的答案,我思前想多一點,我的基本問題可以明確如下:在回答給定here,並且在這種CodeProject entry,我明白,我們周圍的人的問題得到在onCreate()
期間通過向View
發佈Runnable
來維護View's
尺寸不可用。正如Kerry指出的那樣,保證是這個信息Runnable
不能執行,直到onCreate()
執行完畢。我知道佈局發生在onCreate
之後的某個點,但我仍然無法理解爲什麼在View
的尺寸已知時此Runnable
應該執行。
只是進一步的其他信息。您在CodeProject中給出的例子在我看來不太好。我認爲應該在子視圖的onSizeChanged()方法中調用post()方法。他們的方式他們已經做到了我不是100%相信即使根視圖大小將被知道(如果從child.onCreate()調用)。從child.onSizeChanged()調用根視圖必須具有大小以允許繪製子對象。因此這就是爲什麼我說從onSizeChanged()方法調用它。 – Kerry 2012-07-05 11:40:56
我同意,併爲我的目的,我會採取你的意見,並使用'onSizeChanged()'。但是,事實上,它是誰推薦的post()方法(http://stackoverflow.com/questions/3602026/linearlayout-height-in-oncreate-is-0)使我相信,有明確的東西羅曼蓋伊在保證'View'只在佈局時才處理'Runnable'的API。我想這確實是所有的學術,但我想進一步理解爲什麼會這樣。我發佈了一條評論給羅曼。 – Trevor 2012-07-05 11:50:24