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

我有一个有效的视图是一个button。 这是它的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> 

当我把它的能见度设置为这样

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

它消失,但仍占据空间。 喜欢这个: 在这里输入图像说明

这个button是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时,我不希望它占用额外的列表项。 正如文件中所述。

去 – 这个视图是不可见的,它不占用任何空间来布局的目的。

任何想法如何使其不占用空间?

谢谢,Dennis xx

PS我的列表视图是一个FoldersFragment ListFragment里面,这里是我的MainActivity其中FoldersFragment呈现的xml

 <?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就会折叠它的高度,给你一个带有非空格标题的“hidden”。

如果这是需要的话,那么有一个很好的方法来处理它:

 parentView.removeView(chileView); 

这里是一个例子:

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

你可以做的是设置一个if语句,只要条件将可见性设置为“GONE”,将视图设置为包装内容,空间将是免费的,我做到了,并且它为一个seekbar

这是我的解决scheme。 创build名为“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> 

使用条件膨胀新视图内的空布局 。 不要使用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.setVisiable()来控制visiable而不是outerView.setVisiable()。 这个对我有用。

在这个线程中的所有回复build议一个新的包装视图,这是有代价的。 隐藏视图的正确方法是将边距设置为0,同时将可见性设置为“通过”。 在这个代码示例中, cardView是我试图隐藏的视图。 cardView的直接父母是RecyclerView,这就是为什么我们使用RecyclerView.LayoutParams – 记得用正确的布局参数replace。

 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)); 

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