布局的getHeight()由ViewTreeObserver返回零

时间:2015-07-20 11:20:57

标签: android

我在 OnCreate 方法中使用 ViewTreeObserver 来获取工具栏和底部布局的高度,但我仍然得到 0高度,为什么?我做错了吗?

这就是我打电话的方式:

ViewTreeObserver viewTreeObserver = toolbar.getViewTreeObserver();
        viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onGlobalLayout() {
                // Ensure you call it only once :
                toolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                height1 = toolbar.getMeasuredHeight();
            }
        });

        final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.bottom);
        ViewTreeObserver vto = linearLayout.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
            @Override
            public void onGlobalLayout() {
                // Ensure you call it only once :
                linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                height2 = linearLayout.getMeasuredHeight();

            }
        });

        Toast.makeText(getApplicationContext(), String.valueOf(height1) + String.valueOf(height2), Toast.LENGTH_SHORT).show();

3 个答案:

答案 0 :(得分:11)

看起来您的布局必须进行多个度量/布局传递,并且在第一次传递后,这些布局的维度为零。只有在尺寸正确时才尝试删除OnGlobalLayoutListener。像这样:

if (linearLayout.getMeasuredHeight() > 0) {
    linearLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}

答案 1 :(得分:0)

我遇到了同样的问题,但理由与@aga答案不一样。问题是我的视图在初始化活动时隐藏(在onCreate中)。我只是在完成布局大小计算后移动显示/隐藏我的视图的代码,以使其按预期工作。希望这可以提供帮助。

答案 2 :(得分:0)

OnGlobalLayoutListener 适用于 ViewTreeObserver ,其方法 onGlobalLayout 不会立即调用。此侦听器仅适用于当前布局中发生的某些事件(当向侦听器显示某些更改时)。所以,加载布局时会得到 0 height

如果您想在 ViewTreeObserver 之外访问此值,解决方案就是:

private int height;

ViewTreeObserver viewTreeObserver = toolbar.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        height = toolbar.getMeasuredHeight();
        setHeight(height);
        // Ensure you call it only once :
        toolbar.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

private void setHeight(int h) {
    this.height = h;
    Toast.makeText(getApplicationContext(), String.valueOf(height), Toast.LENGTH_SHORT).show();
}