2012-07-05 85 views
1

我最初的問題是需要知道我的根的高度和寬度View,以便我可以進行程序化佈局更改。出於我的目的,我不一定需要在onCreate()期間確定這些信息;對於我來說編程添加我的孩子View s已足夠了,因此我很樂意使用onWindowFocusChanged()作爲掛鉤來確定何時調用根ViewgetWidth()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應該執行。

+0

只是進一步的其他信息。您在CodeProject中給出的例子在我看來不太好。我認爲應該在子視圖的onSizeChanged()方法中調用post()方法。他們的方式他們已經做到了我不是100%相信即使根視圖大小將被知道(如果從child.onCreate()調用)。從child.onSizeChanged()調用根視圖必須具有大小以允許繪製子對象。因此這就是爲什麼我說從onSizeChanged()方法調用它。 – Kerry 2012-07-05 11:40:56

+1

我同意,併爲我的目的,我會採取你的意見,並使用'onSizeChanged()'。但是,事實上,它是誰推薦的post()方法(http://stackoverflow.com/questions/3602026/linearlayout-height-in-oncreate-is-0)使我相信,有明確的東西羅曼蓋伊在保證'View'只在佈局時才處理'Runnable'的API。我想這確實是所有的學術,但我想進一步理解爲什麼會這樣。我發佈了一條評論給羅曼。 – Trevor 2012-07-05 11:50:24

回答

0

我看看View.post(Runnable)方法,在我看來,通過調用該方法,您只需向UI線程隊列添加消息即可。唯一能夠「保證」的是Runnable將在調用post(Runnable)的方法完成後的某個時候執行。這假定你從UI線程中調用post(Runnable),但正如文檔所述:

只有當此視圖連接到窗口時,才能從UI線程之外調用此方法。

我想,以確保雙方你的根視圖和子視圖都有大小,你需要調用從孩子後(Runnable接口)onSizeChanged()方法,因爲如果孩子有大小,我認爲它遵循父母即根視圖因此也必須具有大小。

道歉,如果這是一個漫無邊際的答案。我有點理解你想要達到什麼,但不是100%肯定。讓我知道你是否希望我澄清任何事情。

個人,每當我需要查看我onSizeChanged做的一切的大小(),我相信是這樣做的「正確」的方式,它一直工作。

+0

謝謝。我想我應該是做漫談的道歉人。雖然有關獲得根高/寬我的問題舉行會談,具體是什麼我感興趣的是如何我已經看到了它在幾個地方推薦(例如http://www.codeproject.com/Tips/313848/Get-actual-screen-size-將'Runnable'發佈到'View'是在窗口附加'View'時執行代碼的一種方式。讓我感到困惑的是,在佈局過程期間/之後的某個View的開始處理隊列消息時,我無法看到它在任何地方的任何文檔中定義的。 – Trevor 2012-07-05 10:48:03

+0

我假設(我認爲很安全)的消息的處理僅僅是一個搜索的固有功能。事實上,我認爲它是Java的一部分。因此它沒有在API文檔中明確描述/詳細描述,但它是一種推斷。其實這只是我明白了是查看有大小之前,你的擔心,一個可以查看「進程」的消息(通過調用發送到郵政(Runnable接口)的代碼進行)?如果是這樣,我會說這可能取決於它是如何完成的。但是,如果您使用onSizeChanged()方法調用它,正如我所提到的那樣,您可以保證視圖的大小。 – Kerry 2012-07-05 11:02:32