(Android)布局在setVisibility(view.GONE)后不会重新绘制?

6

我有一个应用程序:

LinearLayout linearLayout2 = (LinearLayout) findViewById(R.id.cvLinearLayout2);

并且之后

linearLayout2.setVisibility(View.GONE);

我找不到把linearLayout2带回来的方法。

尝试了所有:

  linearLayout2.setVisibility(View.VISIBLE);
  linearLayout2.bringToFront();
  linearLayout2.getParent().requestLayout();
  linearLayout2.forceLayout();
  linearLayout2.requestLayout();
  linearLayout2.invalidate();

但是没有结果。 linearLayout2 有一个父级 linearLayout1,所以我也尝试了:

  linearLayout1.requestLayout();
  linearLayout1.invalidate();

目前还没有任何结果。 linearLayout2 仍然是 GONE。 在我的应用程序中,我需要将 linearLayout 移开,然后过一段时间再重新绘制它。请帮忙。


尝试不要一开始就将可见性设置为GONE,然后查看布局是否出现。 - asenovm
只有在你在使它消失和可见之间没有做错任何事情时,才不会发生这种情况。请检查一下是否删除了linearLayout2中包含的任何视图。请发布一些代码片段。 - akkilis
2个回答

7
View.GONE会将视图从屏幕上移除,同时释放该视图占据的空间,被“GONE”的视图无法再次出现,需要重新加载。
如果您想保留该空间,可以使用View.INVISIBLE。此时,视图不会被移除,而是隐藏该视图并显示空白区域。
简单来说,您拥有以下设置: ABCD 在调用B.setVisibility(View.INVISIBLE);之后,您将得到: A CD 但是,在调用B.setVisibility(View.GONE);之后,您将得到: ACD

谢谢,但我需要释放那个空间,所以INVISIBLE仍然保留“空间”,我需要移开LinearLayout,过一段时间后再把它拿回来。 更具体地说,这是全屏功能,所以我需要整个屏幕一段时间,过一段时间后再把LinearLayout2拿回来 :-) - smandic
GONE 之后,您可以像这样重新加载它:LinearLayout linearLayout2 = (LinearLayout) findViewById(R.id.cvLinearLayout2); 然后使用 YourActivity.setLayout(linearLayout2); - Vishnu Haridas
没有这样的方法。 YourActivity.setLayout(linearLayout2); - vntstudy
没错,应该是 setContentView(linearLayout2),感谢您指出。 - Vishnu Haridas
如何在不重新加载完整布局的情况下重新创建子布局? - Denny Kurniawan

7

将视图的可见性设置为GONE不应影响它使用setVisibility(View.VISIBLE)方法“恢复”的能力。

例如,我在我的一个应用程序中有这段代码:

public void onCheckedChanged(CompoundButton checkBox, boolean isChecked{
    if(checkBox == usesLocationCheckBox)
    {
        View view = findViewById(R.id.eventLocationOptions);
        if(isChecked)
        {
            view.setVisibility(View.VISIBLE);
            usesTimeCheckBox.setEnabled(false);
        }
        if(!isChecked)
        {
            view.setVisibility(View.GONE);
            usesTimeCheckBox.setEnabled(true);
        }
    }}

它完全正常运行。你的程序执行的一些其他代码必须要负责。编辑你的帖子并附上相关代码,我们可能能够给你更好的答案。


哎呀.. 代码太大了 :-( setVisibility(View.VISIBLE) 不起作用。但是很简单:我需要全屏特性。在 onCreate() 中创建了 linearlayout2,然后在触摸事件之后(但 ACTION_UP 时),我需要全屏,所以我需要“删除” linearlayout 2(使用 view.GONE),然后过一段时间后我需要它回来,但我无论如何都做不到 :-(view.setVisibility(View.INVISIBLE) 对我来说不好,因为视图仍然占据空间.. 我需要像 .removeView() 这样的东西,但那很复杂...希望我已经解释清楚了...我需要全屏特性..删除视图,然后将其带回数据。 - smandic
你能在这里发布你的代码吗?这样我就可以更好地了解如何帮助你。也许我能找出为什么View.VISIBLE不起作用的原因。 - Garzahd
伙计们,它终于开始工作了!经过两天的尝试,我只保留了view.setVisibility(View.GONE)和view.setVisibility(View.VISIBLE)这两行代码,整个程序就正常运行了。所以Garzahd,你是对的,它确实应该可以工作。谢谢! - smandic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接