这个问题以各种形式被问过很多次,但我没有找到一个明确的答案。
我需要在容器(contentView
)的初始布局后获取子Views
的尺寸和位置。在这种情况下所需的尺寸是不可预测的,可能有多行文本、最小高度以适应装饰等。我不想在每次布局(onLayout
)通过做这件事。我需要测量的是一个嵌套非常深的子项,因此在每个容器中覆盖onLayout
/onMeasure
似乎是一个不好的选择。我不会做任何会导致循环(触发事件期间的事件)的事情。
Romain Guy曾经暗示,我们可以在View
的构造函数中.post
一个Runnable
(我认为它会在UI线程上执行)。这似乎在大多数设备上都有效(在我手头的4个设备中的3个),但在Nexus S上失败了。看起来Nexus S直到对每个子项进行一次通行证之前都没有所有内容的尺寸,并且当调用post
的Runnable
的run
方法时,没有正确的尺寸。我试着在onLayout
中计算布局通行证数(使用getChildCount
进行比较),这在4个设备中的其中3个上又起作用了(在Droid Razr上失败了,在这里似乎只进行一次通行证-并获得所有测量-而不管子项的数量)。我尝试了以上各种变化(正常发布;发布到Handler
;将getContext()
强制转换为Activity
并调用runOnUiThread
...所有结果都相同)。
最后我使用了一个可怕且可耻的不好的方法,通过检查目标组的高度与其父级的高度是否相同来判断它是否已被布局。显然,这不是最好的方法,但似乎是在各种设备和实现之间可靠工作的唯一方法。我知道没有内置事件或回调可用,但有更好的方法吗?
谢谢您!
/编辑 对我来说,关键问题在于Nexus S没有等待布局完成后再.posting()
一个Runnable
,这是我测试过的所有其他设备的情况,也是Romain Guy和其他人建议的情况。我没有找到一个好的解决方法。有吗?