2

我最初的问题是需要知道我的根的高度和宽度,View以便我可以进行编程布局更改。出于我的目的,我不一定需要在onCreate();期间确定此信息。对我来说,在 root 的布局完成后以编程方式添加我的 child 就足够了View,因此我很乐意onWindowFocusChanged()用作挂钩来确定何时调用 root并View返回有效结果。getWidth()getHeight()

但是,我看到很多人问如何ViewonCreate(). 我猜人们想这样做是为了更好的用户体验——也许是为了让用户看不到分阶段构建的布局(如果有人能澄清原因,我会很感激)。现在,我通常看到的答案,例如这里的答案,是将 a 发布到内Runnable的根目录。在里面我们执行,等等。这样做的原因显然是因为发布到 a 的对象是在具有布局和/或附加到窗口时执行的。ViewonCreate()RunnablegetWidth()RunnableViewView

这让我想到了我的问题。在 API 文档中View,它似乎没有描述这种行为。那么,谁能告诉我它是在哪里定义和记录的?或者,是检查源头的问题吗?它是一个绝对且严格定义的功能,Runnables将留在 aView的队列中,并且仅在布局过程之后的某个时间点处理吗?

进一步澄清:在阅读 Kerry 的答案并仔细考虑后,我的基本问题可以澄清如下:在这里给出的答案以及这个CodeProject 条目中,我知道我们解决了根View's维度不存在的问题期间可onCreate()通过发布RunnableView。正如 Kerry 指出的那样,保证是Runnable在执行之前不能执行此消息onCreate()。我知道布局发生在 之后的某个时间点onCreate,但我现在仍然无法理解为什么在' 的尺寸已知Runnable时应该执行此操作。View

4

1 回答 1

0

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

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

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

抱歉,如果这是一个有点漫不经心的答案。我有点理解您想要实现的目标,但不是 100% 确定。如果你想让我澄清任何事情,请告诉我。

就我个人而言,每当我需要 View 的大小时,我都会在 onSizeChanged() 中执行所有操作,我认为这是“正确”的做法,并且一直有效。

于 2012-07-05T10:36:47.243 回答