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);
он исчезает, но все еще занимает пространство. Например: ![enter image description here]()
Эта кнопка является заголовком в 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
P.S. Мой список находится внутри FoldersFragment ListFragment
и вот xml моей MainActivity, где представлен 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>
Ответы
Ответ 1
Это ошибка 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>
Просто скройте LinearLayout с идентификатором LAYOUT_TO_HIDE с Visible.GONE
, а затем root FrameLayout скроет его высоту, предоставив вам "скрытый" заголовок без пробела.
Ответ 2
Все ответы в этой теме предлагают новое представление оболочки, которое стоит дорого. Правильный способ скрыть представление полностью - установить поля на 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);
}
Ответ 3
установите layout_width
и layout_height
в 0
, где вы хотите скрыть элемент, сделав это
//if item parent layout is LinearLayout, change according to your item xml
holder.itemView.setLayoutParams(new LinearLayout.LayoutParams(0,0));
Ответ 4
Если это все еще необходимо, есть отличный способ справиться с этим:
parentView.removeView(childView);
вот пример:
final WhatEverLayout parentView, childView;
parentView = (WhatEverLayout)findViewById(R.id.parentView_xml);
childView =(WhatEverLayout)findViewById(R.id.childView_xml);
parentView.removeView(childView);
Ответ 5
Что вы можете сделать, это установить оператор if, когда условие для установки видимости на "GONE", установите представление в качестве содержимого обертывания, и ваше пространство будет бесплатным, я сделал это, и он работал для поиска
Ответ 6
Это мое решение. Создайте новый файл макета с именем "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
}
Ответ 7
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(), чтобы контролировать видимость, а не внешний вид .setVisiable().
он работает для меня.
Ответ 8
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
Вы можете использовать :
viewToHide?.postDelayed({ viewToHide?.visibility = View.GONE }, durationInMillis)
Ответ 10
Я не думаю, что это ошибка. Просто используйте GONE, чтобы исчезнуть пустое пространство.
CSS делает то же самое. Попробуйте display: block
vs visibility: hidden
.