2010-01-21 171 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

相关问题