web-dev-qa-db-ja.com

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-このビューは非表示であり、レイアウトのためにスペースを取りません。

スペースを占有しないようにする方法に関するアイデアはありますか?

ありがとう、デニスxx

追伸私のリストビューはFoldersFragment ListFragment内にあり、ここにFoldersFragmentが提示されているMainActivityの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>
52
Dennis

これは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>

ただID LAYOUT_TO_HIDEのLinearLayoutを非表示 with Visible.GONEその後、ルートFrameLayoutはその高さを折りたたむと、非空白スペースヘッダーを持つ「非表示」になります。

44
noni

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

このスレッドのすべての返信は、新しいラッパービューを提案していますが、これにはコストがかかります。ビューを完全に非表示にする正しい方法は、可視性を[〜#〜] 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);
}
8
Jaguar

これがまだ必要な場合、それに対処するための素晴らしい方法があります:

parentView.removeView(childView);

ここに例を示します:

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

これが私の解決策です。 「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>

条件を使用して、空のレイアウトを拡大 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
}
2
kyorilys

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()ではなく、visiableを制御します。わたしにはできる。

2
wanglugao

あなたができることはifステートメントを設定することです。可視性を「GONE」に設定する条件がいつでもビューをラップコンテンツとして設定し、スペースが解放されると、私はそれを行い、シークバーのために働きました

2
Jayo2k
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);
 }
0
murugan mani