我最初的问题是需要知道我的根的高度和宽度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