Android - 初始布局后的反应

mom*_*omo 4 android

这个问题已经多次以各种形式提出过,但我还没有找到明确的答案.

我需要能够在Views容器的初始布局(a contentView)之后获得后代的尺寸和位置.在这种情况下所需的尺寸是一个不可预测的视图(组) - 可能有多行文本,最小高度以容纳装饰等.我不想在每个布局pass(onLayout)上做每一个.我需要的测量是从一个深度嵌套的孩子,所以重写onLayout/ onMeasure每个集装箱之间似乎一个糟糕的选择.我不会做任何会导致循环的事情(事件中的触发事件).

Romain Guy曾暗示我们可以在.posta Runnable的构造函数中使用View(AFAIK将在UI线程中).这似乎适用于大多数设备(在我个人的4个中有3个),但在Nexus S上失败.看起来像Nexus S没有任何尺寸,直到每个孩子完成一次通过,并且没有正确的尺寸当调用posted Runnablerun方法时.我尝试计算布局传递(in onLayout)和比较getChildCount,它再次适用于4中的3,但是不同的3(在Droid Razr上失败,似乎只进行一次传递 - 并获得所有测量 - 无论儿童的数量如何).我尝试了以上的各种排列(正常发布;发布到a Handler;转换getContext()为a Activity并调用runOnUiThread...所有的结果相同).

我最终使用了一个可怕的可耻的不善的黑客,通过检查目标群体的高度与其父母的身高 - 如果它不同,则意味着它已被布局.显然,不是最好的方法 - 但是唯一似乎在各种设备和实现之间可靠地工作的方法.我知道我们可以使用没有内置事件或回调,但有更好的方法吗?

TYIA

/编辑底线我,我的猜测是,Nexus S的不等到布局完成后,当.posting()Runnable,因为是我测试过的所有其他设备的情况下,通过罗曼盖伊和其他人的建议.我还没有找到一个好的解决方法.有吗?

Han*_*itt 9

我成功使用了OnGlobalLayoutListener.

它在我的Nexus S上运行得很好

final LinearLayout marker = (LinearLayout) findViewById(R.id.distance_marker);
OnGlobalLayoutListener listener = new OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        //some code using marker.getHeight(), etc.
        markersContainer.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
};
marker.getViewTreeObserver().addOnGlobalLayoutListener(listener);
Run Code Online (Sandbox Code Playgroud)