我有一个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:
我放弃了尝试这种方法。相反,我使用动画并让它工作。 谢谢:))
答案 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