2012-07-05 45 views
1

我最初的问题是需要知道我的根的高度和宽度View,以便我可以进行程序化布局更改。出于我的目的,我不一定需要在onCreate()期间确定这些信息;对于我来说编程添加我的孩子View s已足够了,因此我很乐意使用onWindowFocusChanged()作为挂钩来确定何时调用根ViewgetWidth()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应该执行。

+0

只是进一步的其他信息。您在CodeProject中给出的例子在我看来不太好。我认为应该在子视图的onSizeChanged()方法中调用post()方法。他们的方式他们已经做到了我不是100%相信即使根视图大小将被知道(如果从child.onCreate()调用)。从child.onSizeChanged()调用根视图必须具有大小以允许绘制子对象。因此这就是为什么我说从onSizeChanged()方法调用它。 – Kerry 2012-07-05 11:40:56

+1

我同意,并为我的目的,我会采取你的意见,并使用'onSizeChanged()'。但是,事实上,它是谁推荐的post()方法(http://stackoverflow.com/questions/3602026/linearlayout-height-in-oncreate-is-0)使我相信,有明确的东西罗曼盖伊在保证'View'只在布局时才处理'Runnable'的API。我想这确实是所有的学术,但我想进一步理解为什么会这样。我发布了一条评论给罗曼。 – Trevor 2012-07-05 11:50:24

回答

0

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

只有当此视图连接到窗口时,才能从UI线程之外调用此方法。

我想,以确保双方你的根视图和子视图都有大小,你需要调用从孩子后(Runnable接口)onSizeChanged()方法,因为如果孩子有大小,我认为它遵循父母即根视图因此也必须具有大小。

道歉,如果这是一个漫无边际的答案。我有点理解你想要达到什么,但不是100%肯定。让我知道你是否希望我澄清任何事情。

个人,每当我需要查看我onSizeChanged做的一切的大小(),我相信是这样做的“正确”的方式,它一直工作。

+0

谢谢。我想我应该是做漫谈的道歉人。虽然有关获得根高/宽我的问题举行会谈,具体是什么我感兴趣的是如何我已经看到了它在几个地方推荐(例如http://www.codeproject.com/Tips/313848/Get-actual-screen-size-将'Runnable'发布到'View'是在窗口附加'View'时执行代码的一种方式。让我感到困惑的是,在布局过程期间/之后的某个View的开始处理队列消息时,我无法看到它在任何地方的任何文档中定义的。 – Trevor 2012-07-05 10:48:03

+0

我假设(我认为很安全)的消息的处理仅仅是一个搜索的固有功能。事实上,我认为它是Java的一部分。因此它没有在API文档中明确描述/详细描述,但它是一种推断。其实这只是我明白了是查看有大小之前,你的担心,一个可以查看“进程”的消息(通过调用发送到邮政(Runnable接口)的代码进行)?如果是这样,我会说这可能取决于它是如何完成的。但是,如果您使用onSizeChanged()方法调用它,正如我所提到的那样,您可以保证视图的大小。 – Kerry 2012-07-05 11:02:32