这个问题已经以各种形式被问过好几次了,但我还没有找到明确的答案。
Views
在容器(a contentView
)的初始布局之后,我需要能够获得后代的尺寸和位置。在这种情况下所需的尺寸是不可预测的 View(Group) - 可能有多行文本、容纳装饰的最小高度等。我不想在每个布局通道 ( onLayout
) 上都这样做。我需要的测量来自一个深度嵌套的孩子,所以覆盖中间每个容器的onLayout
/onMeasure
似乎是一个糟糕的选择。我不会做任何会导致循环的事情(触发事件期间事件)。
Romain Guy 曾暗示我们可以只在.post
aRunnable
的构造函数中使用 a View
(AFAIK 将在 UI 线程中)。这似乎适用于大多数设备(在我个人拥有的 4 台设备中的 3 台设备上),但在 Nexus S 上失败。看起来 Nexus S 没有所有的尺寸,直到每个孩子完成一次,并且没有正确的尺寸当post
edRunnable
的run
方法被调用时。我尝试计算布局传递(in onLayout
)并与 进行比较getChildCount
,这同样适用于 4 个中的 3 个,但不同的 3 个(在 Droid Razr 上失败,它似乎只做一次传递 - 并获得所有测量值 - 无论孩子的数量如何)。我尝试了上述的各种排列(正常发布;发布到一个Handler
;铸造getContext()
到一个Activity
并调用runOnUiThread
...所有结果相同)。
我最终使用了一个可怕的可耻的无用黑客,通过检查目标群体的高度与其父母的高度 - 如果它不同,则意味着它已经被布置了。显然,这不是最好的方法——但似乎是唯一一种在各种设备和实现之间可靠工作的方法。我知道我们没有可以使用的内置事件或回调,但有更好的方法吗?
TYIA
/EDIT我猜对我来说,最重要的是 Nexus S 不会等到布局完成后.posting()
a Runnable
,就像我测试过的所有其他设备上的情况一样,正如 Romain Guy 和其他人所建议的那样。我还没有找到一个好的解决方法。有吗?