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_width
和layout_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
。