在Android中运行时隐藏线性布局

5

I am having following layout

<merge>
    <LinearLayout
        android:id="@+id/ll_main"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        />
    <LinearLayout
        android:id="@+id/ll_sub"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        />  
</merge>

我想在运行时通过setVisibility()来显示/隐藏ll_sub布局,但它不起作用。
当我从ll_sub的xml中设置android:visibility="gone"(我也使用了invisible)时,它不会显示在屏幕上。这时,当我尝试使用setVisibility()在运行时显示此布局时,它会显示出来,但是一旦我尝试隐藏此布局时,它就无法隐藏。
编辑:
我正在尝试点击按钮来显示/隐藏此线性布局。
LinearLayout ll;
Button minimize;
int visibility=0;

@Override
public void onCreate(Bundle savedInstanceState)
{
    ll=(LinearLayout)findViewById(R.id.ll_sub);
    minimize=(Button)findViewById(R.id.minimize);
    minimize.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {

            if(visibility==0)
            {
                visibility=2;
            }
            else
            {
                visibility=0;
            }
            ll.setVisibility(visibility);

        }
    });
}

1
你不是忘了调用invalidate方法了吧? - Thomas Padron-McCarthy
2个回答

16

看起来您正在设置错误的常量来更改视图可见性

GONE == 8
INVISIBLE == 4
VISIBLE == 0

然而,您永远不应该依赖于Android所指定的实际值来表示它们的常量。相反,请使用 View 类中定义的值:View.VISIBLEView.INVISIBLEView.GONE

// snip...
if(visibility == View.VISIBLE)
{
    visibility = View.GONE;
}
else
{
    visibility = View.VISIBLE;
}
ll.setVisibility(visibility);

别忘了在视图上调用invalidate() :)


1
invalidate在高度嵌套的布局中非常重要。 - John Stack

2

您应该使用View提供的常量

View.INVISBLE, View.VISIBLE, View.GONE

并且使您的视图无效


从一个新用户到另一个新用户,这不是关于声誉,而是关于传播知识。请记住这一点,赞将自然而然地到来! - skabbes
那条评论并不是关于“失去”声誉的。我并不在意那个。我只是幸运地知道了一些东西;-) - Hache

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