在触发另一个事件之前,布局高度不会更新

时间:2012-12-02 13:30:54

标签: android android-layout

我有一个LinearLayout(A),它在布局xml中设置为GONE。我想要实现的是,当单击一个按钮(B)时,LinearLayout(A)将被设置为VISIBLE,然后我得到它的高度来更新其父布局的高度。我设法将LinearLayout(A)设置为可见并获得其高度,但是我无法直接更新其父布局的高度。我当前代码的问题是,父布局只会在触发另一个UI事件后更新自身(例如打开微调器下拉菜单,显示软键盘等)。我真正想要的是,在点击按钮(B)之后,父布局会直接更新。

这是我的代码。

@Override
public void onClick(View v) {
    if(v==buttonB) {
        ShowLinearLayoutA();
    }
}

private ViewTreeObserver vto;

private void ShowLinearLayoutA() {
    LinearLayoutA.setVisibility(View.VISIBLE);
    if (vto == null) {
        vto = LinearLayoutA.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight();
                ParentLayout.invalidate();
            }
        });
    }
}

我做错了什么?

请原谅我的英语,并提前非常感谢。

编辑1: 我尝试使用runOnUiThread,但它不起作用

我的编辑代码

private void ShowLinearLayoutA() {
    LinearLayoutA.setVisibility(View.VISIBLE);
    if (vto == null) {
        vto = LinearLayoutA.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ParentLayout.invalidate();
                    }
                });
            }
        });
    }
}

编辑2:

我放弃了尝试这种方法。相反,我使用动画并让它工作。 谢谢:))

4 个答案:

答案 0 :(得分:1)

您正在错误的线程上执行UI工作。在UiThread上执行UI操作,如..,。

private void ShowLinearLayoutA() {
    YourActivity.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            LinearLayoutA.setVisibility(View.VISIBLE);
        }
    });

if (vto == null) {
    vto = LinearLayoutA.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            YourActivity.this.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    ParentLayout.getLayoutParams().height=LinearLayoutA.getHeight();
                    ParentLayout.invalidate();
                }
            });
        }
    });
}
}

答案 1 :(得分:0)

呼叫

LinearLayoutA.invalidate()

答案 2 :(得分:0)

我放弃了尝试这种方法。相反,我使用动画并让它工作。谢谢:))

答案 3 :(得分:0)

我知道这是一个很老的问题,但我想它没有答案。 我努力解决同样的问题,关键是你在运行时更改高度之前更新高度,简单的延迟任务可能是一个解决方案。

_layout.postDelayed(new Runnable() {
        @Override
        public void run() {
            _layout.setBackgroundDrawable(backgroundImage);
        }
    }, 100); // delayed for 0.1 sec