setVisibility(GONE)视图变为不可见但仍占用空间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了setVisibility(GONE)视图变为不可见但仍占用空间相关的知识,希望对你有一定的参考价值。

我有一个视图,实际上是一个按钮。这是它的XML布局(add_new.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <Button
        android:id="@+id/buttonNew"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/bText" 
        android:onClick="addNew"/>
</LinearLayout>

当我将其可见性设置为GONE时

v = getActivity().getLayoutInflater().inflate(R.layout.add_new, null);
v.setVisibility(View.GONE);

它消失但仍占据空间。像这样:

此按钮是ListView中的标题,由此xml定义:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/porno" >

    <ImageView
        android:id="@+id/icon"
        android:layout_width="30dp"
        android:layout_height="40dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="4dp"
        android:src="@drawable/ic_launcher">
    </ImageView>

    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/label"
        android:textSize="20dp" >
    </TextView>

</LinearLayout> 

当其可见性设置为GONE时,我不希望它占用额外的列表项。正如文档中所述。

GONE - 此视图不可见,并且不需要任何空间用于布局。

关于如何使它不占用空间的任何想法?

谢谢,Dennis xx

附:我的listview位于FoldersFragment ListFragmentand里面这里是我的MainActivity的xml,其中提供了FoldersFragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <fragment
        android:id="@+id/foldersFragment"
        android:layout_width="200dip"
        android:layout_height="match_parent"
        class="com.example.fragments.FoldersFragment" >
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.example.fragments.DetailFragment" >
    </fragment>

</LinearLayout>
答案

在我看来,这是一个Android错误,我们只是解决了这个问题:

<FrameLayout android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout android:id="@+id/layout_to_hide"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content">
         //Put here your views
    </LinearLayout>
</FrameLayout>

只需使用Visible.GONE隐藏带有ID LAYOUT_TO_HIDE的LinearLayout,然后根FrameLayout将折叠其高度,为您提供带有非空格标题的“隐藏”。

另一答案

这个帖子中的所有回复都建议一个新的包装器视图,这需要付出代价。完全隐藏视图的正确方法是将边距设置为0,同时将可见性设置为GONE。在此代码示例中,cardView是我试图隐藏的视图。 cardView的直接父级是RecyclerView,这就是我们使用RecyclerView.LayoutParams的原因 - 记得用正确的布局参数替换。

if (cardView.getVisibility() != GONE) {
    cardView.setVisibility(GONE);
    RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) cardView.getLayoutParams();
    layoutParams.setMargins(0, 0, 0, 0);
    cardView.setLayoutParams(layoutParams);
}
另一答案

layout_widthlayout_height设置为0,你要隐藏项目,通过这样做

//if item's parent layout is LinearLayout, change according to your item xml
holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(0,0));
另一答案

如果仍然需要这样,有一个很好的方法来处理它:

parentView.removeView(childView);

这里有一个例子:

final WhatEverLayout parentView, childView;
parentView = (WhatEverLayout)findViewById(R.id.parentView_xml);
childView =(WhatEverLayout)findViewById(R.id.childView_xml);
parentView.removeView(childView);
另一答案

您可以做的是设置if语句,每当条件将可见性设置为“GONE”时,将视图设置为包装内容并且您的空间将是空闲的,我做了它并且它适用于搜索条

另一答案

这是我的解决方案。创建名为“special.xml”的新布局文件,将代码复制到该文件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
    android:visibility="gone">

</LinearLayout>

使用条件来扩充newview中的空布局。不要使用view.setVisibility(View.GONE);.

if(true){
  view=mInflater.inflate ( R.layout.special,parent, false );
}else{
  view=mInflater.inflate(R.layout.normal,parent,false);
  // The view that you want to be visible
}
另一答案

header_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <LinearLayout
            android:id="@+id/mHeaderView"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <TextView
                android:id="@+id/mNoHelpLayout"
                android:layout_width="match_parent"
                android:layout_height="176dip"
                android:background="#ffffffff"
                android:gravity="center"
             />
       </LinearLayout>
   </LinearLayout>

java代码:

LayoutInflater mInflater =(LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View outerView =  mInflater.inflate(R.layout.header_layout, null);
mHeaderView = (LinearLayout) outerView.findViewById(R.id.mHeaderView);

使用mHeaderView.setVisible()来控制可见而不是outerView.setVisible()。这个对我有用。

另一答案
If you want to show itemView 

if (ItemBean.isShow()) 
{
   holder.itemView.setVisibility(View.VISIBLE);
   holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
 } else
 {
     holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(0, 0));
     holder.itemView.setVisibility(View.GONE);
 }
另一答案

我不认为这是一个错误..只需使用GONE使空白区域消失。 CSS做同样的事情。试试display: block vs visibility: hidden

以上是关于setVisibility(GONE)视图变为不可见但仍占用空间的主要内容,如果未能解决你的问题,请参考以下文章

如何从 View.gone 恢复视图。在xml中使用'android:visibility =“gone”'后setVisibility(View.VISIBLE)不起作用

setvisibility(view.visible)在setvisibility(view.gone)之后不起作用

Android:为什么setVisibility(View.GONE);或setVisibility(View.INVISIBLE);不工作

Android:为啥要设置可见性(View.GONE);或 setVisibility(View.INVISIBLE);不工作

Android set View.GONE 不会在列表视图中“释放”空间

Android的setVisibility(View.GONE)无效的问题及原因分析(转)