2010-01-21 172 views
9

我需要根據我的活動中窗口小部件和視圖的初始佈局準備一些對象。我想在初始化步驟中完成,理想情況下是onCreate和onStart。考慮到我們不在前臺時發生變化的可能性,其中一些可能需要在onResume中發生。什麼時候android首先做佈局?

所以我檢查了我是否可以衡量我的觀點是如何佈置的。

Log.d("MyApp", "w,h of X is " + findViewById(R.id.X).getWidth() + 
     "," + findViewById(R.id.X).getHeight()); 

我在onCreate,onStart和onResume中運行了這個。每次我得到0,0的寬度,高度。如果我等待onTouchEvent,我會得到佈局信息,所以佈局在那時完成。

我很驚訝佈局沒有設置和最終的時間,我看到onResume。我預計這些小部件已經佈置好了,並準備好擺弄。

回答

4

佈局根據需要由視圖層次結構完成。

當你的應用程序啓動時,這將在onResume()(當你的窗口被調出並放置在屏幕上)之後一段時間。

摸透佈局操作的正確方式是通過不同的視圖層次回調 - View.onSizeChanged()等「佈局」下here的記載:

+0

我做的onSizeChanged方法的堆棧跟蹤,它確實來自消息調度循環。 – Brian 2010-01-22 02:20:19

+1

似乎沒有辦法在沒有子類化的情況下設置「onSizeChanged」處理程序,這是不幸的,因爲某些佈局沒有構造函數。你最終不得不爲那些應該是微不足道的事情做很多工作。 – 2010-12-19 18:04:05

+1

@dpk您可以使用ViewTreeObserver設置與繪圖和佈局相關的一堆回調,從而避免必須對視圖進行子類化。 – 2013-04-13 02:41:29

相關問題