我原来的问题是需要知道我的根View
的高度和宽度,以便我可以进行程序化布局更改。就我的目的而言,我不一定需要在onCreate()
期间确定此信息;在root的布局完成之后,以编程方式添加我的子View
已经足够了,因此我很高兴使用onWindowFocusChanged()
作为钩子来确定何时调用根{{1} } View
和getWidth()
将返回有效结果。
但是,我看到很多人在getHeight()
期间询问如何确定根View
的大小。我猜想人们想要做到这一点以获得更好的用户体验 - 也许这样用户就不会看到布局是分阶段构建的(如果有人能澄清原因,我会很感激)。现在,我经常看到的答案,例如一个here,就是将onCreate()
发布到Runnable
内的根View
。在onCreate()
内部,我们会执行Runnable
等。之所以如此有效,是因为显然getWidth()
个Runnable
对象在View
时执行了View
有布局和/或附加到窗口。
这让我想到了我的问题。在View
的API文档中,它似乎没有描述此行为。那么,谁能告诉我它的定义和记录?或者,是否需要检查来源?它是一个绝对且严格定义的功能,Runnables
将保留在View
的队列中,并且只能在布局过程后的某个点处理吗?
进一步澄清:在阅读Kerry的回答并进一步思考之后,我的基本问题可以澄清如下:给出here的答案以及{{3}我明白,通过向View's
发布onCreate()
,我们可以解决Runnable
期间根View
维无法使用的问题。正如Kerry指出的那样,保证在Runnable
执行之前不能执行此消息onCreate()
。我理解布局在onCreate
之后的某个时间点发生,但我仍然无法掌握当Runnable
的维度已知时为什么要执行此View
。
答案 0 :(得分:0)
我查看了View.post(Runnable)方法,在我看来,通过调用该方法,您只需向UI线程队列添加消息。唯一能够“保证”的是Runnable将在调用post(Runnable)的方法完成之后的某个时间执行。这假设您从UI线程调用post(Runnable),但正如文档所说:
只有当此视图附加到窗口时,才能从UI线程外部调用此方法。
我认为确保你的Root视图和子视图都有大小,你需要从子onSizeChanged()方法调用post(Runnable),因为如果孩子有大小,我认为它遵循Parent即因此,根视图也必须具有大小。
道歉,如果这是一个漫无边际的答案。我有点理解你想要达到的目标但不是100%肯定。如果您要我澄清任何内容,请告诉我。
就个人而言,只要我需要View的大小,我就会在onSizeChanged()中做所有事情,我相信这是做到这一点的'正确'方式,并且它始终有效。