View.post(),以及执行Runnables时

时间:2012-07-05 10:07:24

标签: android

我原来的问题是需要知道我的根View的高度和宽度,以便我可以进行程序化布局更改。就我的目的而言,我不一定需要在onCreate()期间确定此信息;在root的布局完成之后,以编程方式添加我的子View已经足够了,因此我很高兴使用onWindowFocusChanged()作为钩子来确定何时调用根{{1} } ViewgetWidth()将返回有效结果。

但是,我看到很多人在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

1 个答案:

答案 0 :(得分:0)

我查看了View.post(Runnable)方法,在我看来,通过调用该方法,您只需向UI线程队列添加消息。唯一能够“保证”的是Runnable将在调用post(Runnable)的方法完成之后的某个时间执行。这假设您从UI线程调用post(Runnable),但正如文档所说:

  

只有当此视图附加到窗口时,才能从UI线程外部调用此方法。

我认为确保你的Root视图和子视图都有大小,你需要从子onSizeChanged()方法调用post(Runnable),因为如果孩子有大小,我认为它遵循Parent即因此,根视图也必须具有大小。

道歉,如果这是一个漫无边际的答案。我有点理解你想要达到的目标但不是100%肯定。如果您要我澄清任何内容,请告诉我。

就个人而言,只要我需要View的大小,我就会在onSizeChanged()中做所有事情,我相信这是做到这一点的'正确'方式,并且它始终有效。