View.GONE 仍然在布局中占用空间

Posted

技术标签:

【中文标题】View.GONE 仍然在布局中占用空间【英文标题】:View.GONE still taking space in the layout 【发布时间】:2017-04-13 05:59:38 【问题描述】:

我想将一个视图设置为 GONE,然后让其他视图占用剩余空间。

现在如果我将它设置为 GONE,它会在布局中留下一个空间,该视图是一个固定高度的 viewpager。

到目前为止,我读到我必须删除边距,并且没有固定的 viewpager 高度,所以我尝试做这样的事情

    if (cardsChoice.predictive == true) 

        viewPagerPredicts.setVisibility(View.VISIBLE);
        RelativeLayout.LayoutParams layoutParams = 
        (RelativeLayout.LayoutParams)viewPagerPredicts.getLayoutParams();
        layoutParams.setMargins(8,4,8,0);
        layoutParams.height = R.dimen.predicts_pager_height;
        viewPagerPredicts.setLayoutParams(layoutParams);

    else

        viewPagerPredicts.setVisibility(View.GONE);
        RelativeLayout.LayoutParams layoutParams =  
        (RelativeLayout.LayoutParams)viewPagerPredicts.getLayoutParams();
        layoutParams.setMargins(0,0,0,0);
        layoutParams.height = 0;
        viewPagerPredicts.setLayoutParams(layoutParams);
    

但这不起作用 - 视图似乎要么忽略值并与父级匹配,要么消失并带走其余布局。

谁能看出我做错了什么?

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout     
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:fitsSystemWindows="true"
tools:context=".MainActivity">

<RelativeLayout
    android:layout_
    android:layout_>

    <RelativeLayout
        android:layout_
        android:layout_
        android:id="@+id/viewpagerHolder"
        android:layout_marginTop="64dp"
        android:layout_alignParentBottom="true">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager2"
            android:layout_
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_ />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager_predicts"
            android:layout_
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="4dp"
            android:layout_
            android:layout_below="@id/viewpager2" />

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_
            android:layout_
            app:tabGravity="fill"
            android:layout_below="@id/viewpager_predicts"
            android:theme="@style/CustomTabLayoutStyle"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab2"
            android:layout_
            android:layout_
            app:elevation="4dp"
            android:src="@drawable/ic_playlist_play_white_24dp"
            android:layout_alignBottom="@+id/viewpager2"
            android:layout_alignRight="@+id/viewpager2"
            android:layout_alignEnd="@+id/viewpager2" />


        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:background="@color/windowBackground"
            android:layout_
            android:layout_
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:layout_below="@+id/tabs" />


    </RelativeLayout>

</RelativeLayout>

<android.support.design.widget.AppBarLayout
    android:layout_
    android:layout_>

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_ />

</android.support.design.widget.AppBarLayout>



</android.support.design.widget.CoordinatorLayout>

【问题讨论】:

尝试将 visibility:gone 参数放在 xml 文件中,看看事情的表现如何。我认为边距在这里没有任何关系,但也许事实是,某些项目需要该视图,因为它们对齐为 layout_below:viewpager_predicts 使其成为 View.INVISIBLE 【参考方案1】:

您提到“其他视图占用了剩余空间”,其他视图。我可以看到以下

viewpager2 - 它不会占用空间,因为它有固定的高度 card_pager_height viewpager - 仅当标签因 viewpager_predicts 而受到影响时才会占用空间。

选项卡 - viewpager_predicts 消失后必须受到影响,但您定义了 android:layout_below="@id/viewpager_predicts",它在 viewpager_predicts 消失后将不再有效。 请改正。

在将可见性设置为 GONE 后,还有一件事,无需更改 layoutParam,因为它没有用。

【讨论】:

非常感谢您所说的一切都非常有道理,我相信会有所帮助我会尝试一些事情,看看我是否可以让它工作我希望标签布局能够除非布尔值等于 x,否则在 viewpager2 下,在这种情况下将在 viewpagerpredicts 下,我是自学的,不会尽可能多地阅读文档,非常感谢【参考方案2】:

    可能是 layout_marginTop="64dp" 和 android:layout_alignParentBottom="true" 让你感到困惑。

    可能的原因可能是片段附加到主机活动。 将寻呼机适配器设置为 null 然后设置可见性消失。

    如果(cardsChoice.predictive == true) viewPagerPredicts.setAdapter(new YourFragmentAdapter());

        viewPagerPredicts.setVisibility(View.VISIBLE);
        RelativeLayout.LayoutParams layoutParams = 
        (RelativeLayout.LayoutParams)viewPagerPredicts.getLayoutParams();
        layoutParams.setMargins(8,4,8,0);
        layoutParams.height = R.dimen.predicts_pager_height;
        viewPagerPredicts.setLayoutParams(layoutParams);
    
    else
    
        viewPagerPredicts.setAdapter(null);
        viewPagerPredicts.setVisibility(View.GONE);
        RelativeLayout.LayoutParams layoutParams =  
        (RelativeLayout.LayoutParams)viewPagerPredicts.getLayoutParams();
        layoutParams.setMargins(0,0,0,0);
        layoutParams.height = 0;
        viewPagerPredicts.setLayoutParams(layoutParams);
    
    

【讨论】:

这看起来是个好主意,我今晚会检查并在这里更新非常感谢【参考方案3】:

我认为您正在寻找这样的东西。 将其放入某个布局文件并检查预览中的行为。在第二个文本视图上设置可见性,您会注意到第一个文本视图占用了剩余的屏幕高度。这可以直接从布局中实现,而无需以编程方式进行设置。

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical">

    <TextView
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:text="@string/about_app" />

    <TextView
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:text="@string/about_app" />

</LinearLayout>

【讨论】:

【参考方案4】:

好的,我解决了我的问题,部分原因是@Girish 指出的我的布局(没有任何东西占用空白空间,因为没有什么可以)而且我试图在布局消失后编辑布局参数但是我想提到的另一件事是我使用尺寸作为我的布局高度,这似乎也导致空间为空但保留其空间(像 View.INVISIBLE 一样)所以为了解决这个问题,我已经将它包裹在另一个视图并使 View.GONE 看起来效果很好,所以我的最终代码看起来像这样

if (cardsChoice.predictive) 

        linearLayout.setVisibility(View.VISIBLE);
        viewPagerPredicts.setVisibility(View.VISIBLE);
        LinearLayout.LayoutParams layoutParams = 
        (LinearLayout.LayoutParams)viewPagerPredicts.getLayoutParams();
        layoutParams.setMargins(8,4,8,0);
        viewPagerPredicts.setLayoutParams(layoutParams);

    else

        viewPagerPredicts.setAdapter(null);
        LinearLayout.LayoutParams layoutParams = 
        (LinearLayout.LayoutParams)viewPagerPredicts.getLayoutParams();
        layoutParams.setMargins(0,0,0,0);
        viewPagerPredicts.setLayoutParams(layoutParams);
        viewPagerPredicts.setVisibility(View.GONE);
        linearLayout.setVisibility(View.GONE);
     

我的 xml 看起来像这样

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout   
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:fitsSystemWindows="true"
tools:context=".MainActivity">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:id="@+id/viewpagerHolder"
        android:layout_marginTop="64dp">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager2"
            android:layout_
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_ />

        <LinearLayout
            android:layout_
            android:layout_
            android:id="@+id/predictsHolder"
            android:orientation="vertical">

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager_predicts"
            android:layout_
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="4dp"
            android:layout_ />

        </LinearLayout>

        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_
            android:layout_
            app:tabGravity="fill"
            android:theme="@style/CustomTabLayoutStyle" />

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:background="@color/windowBackground"
            android:layout_
            android:layout_
             />


    </LinearLayout>

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab2"
    android:layout_
    android:layout_
    app:elevation="4dp"
    android:src="@drawable/ic_playlist_play_white_24dp" />

<android.support.design.widget.AppBarLayout
    android:layout_
    android:layout_>

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_
        android:layout_ />

</android.support.design.widget.AppBarLayout>

感谢你们的帮助,你们都应该得到一个 cookie 和答案的分数,但我只能说抱歉

【讨论】:

以上是关于View.GONE 仍然在布局中占用空间的主要内容,如果未能解决你的问题,请参考以下文章

setVisibility(View.Gone) 工作,但视图仍然拥有空间

android能否让一个布局或一个组件完全隐藏并且不占位置

xcode自动布局隐藏视图占用空间

怎样设置android中ImageView为不显示?

隐藏布局和控件

Android:隐形和消失的区别?