我的视图实际上是一个按钮。这是它的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 - 此视图不可见,并且不占用任何空间 布局目的。
关于如何使它不占空间的任何想法?
谢谢, 丹尼斯xx
P.S。我的listview位于FoldersFragment ListFragment
内,这是我的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>
答案 0 :(得分:44)
我认为这是一个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将折叠其高度,为您提供带有非空格标题的“隐藏”。
答案 1 :(得分:8)
此主题中的所有回复都建议使用新的包装器视图,这需要付出代价。完全隐藏视图的正确方法是在设置 GONE 的可见性时将边距设置为0。在此代码示例中, 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);
}
答案 2 :(得分:7)
将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));
答案 3 :(得分:3)
如果仍然需要这样做,有一个很好的方法来处理它:
parentView.removeView(childView);
这里有一个例子:
final WhatEverLayout parentView, childView;
parentView = (WhatEverLayout)findViewById(R.id.parentView_xml);
childView =(WhatEverLayout)findViewById(R.id.childView_xml);
parentView.removeView(childView);
答案 4 :(得分:2)
你可以做的是设置一个if语句,每当条件将可见性设置为“GONE”时,将视图设置为换行内容,你的空间将是空闲的,我做了它并且它适用于一个搜索栏
答案 5 :(得分:2)
这是我的解决方案。创建一个名为&#34; special.xml&#34;的新布局文件,将代码复制到文件中。
<?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
}
答案 6 :(得分:2)
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()控制可见而不是outerView.setVisiable()。 它对我有用。
答案 7 :(得分:1)
在使用TransitionManager.beginDelayedTransition()
时,我遇到了类似的问题,在Layout Inspector tool
中,我看到视图是Gone
,但仍然占用了空间,我认为这是Android中的错误,一种解决方法是使用View.post(Runnable action)
答案 8 :(得分:0)
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);
}
答案 9 :(得分:0)
您可以使用:
viewToHide?.postDelayed({ viewToHide?.visibility = View.GONE }, durationInMillis)
答案 10 :(得分:0)
一种通用且简单的解决方案是避免所有此类繁琐的代码:
您需要在要隐藏的视图集上添加容器布局或父级布局。可以是CardView或FrameLayout等。
它必须是您要隐藏的视图的父级。而且您不会得到所有这些空白。因为它将考虑隐藏整个容器,而不是考虑对HIDE的单个视图,从而避免出现空白。
答案 11 :(得分:0)
对我来说,如果我在下一个运行循环中进行显示/隐藏,它会起作用。
parentView.post {
childViewToHide.visibility = View.GONE
}
答案 12 :(得分:0)
将视图填充和边距设置为 0,然后将视图可见性设置为消失解决了我的问题。
答案 13 :(得分:0)
最简单的方法是在子视图改变后强制父视图重新测量自己的高度。
尝试这样的事情:
parentView.setLayoutParams(new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT));
在这种情况下,父视图是一个 LinearLayout。
答案 14 :(得分:-5)
我不认为这是一个错误..只需使用GONE让空白区域消失。
CSS做同样的事情。试试display: block
vs visibility: hidden
。