3

GONE我有一个在布局 xml中设置的 LinearLayout(A) 。我想要实现的是,当单击按钮(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

4 回答 4

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();
                }
            });
        }
    });
}
}
于 2012-12-02T13:40:51.803 回答
1

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

_layout.postDelayed(new Runnable() {
        @Override
        public void run() {
            _layout.setBackgroundDrawable(backgroundImage);
        }
    }, 100); // delayed for 0.1 sec
于 2015-08-04T13:34:27.327 回答
0

称呼

LinearLayoutA.invalidate()
于 2012-12-02T13:34:37.470 回答
0

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

于 2012-12-19T15:55:15.143 回答