Подтвердить что ты не робот

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>
4b9b3361

Ответ 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.