Android VIewpager内部Coordinator布局占用了额外的可视空间

Android VIewpager内部Coordinator布局占用了额外的可视空间,android,android-layout,android-viewpager,android-coordinatorlayout,Android,Android Layout,Android Viewpager,Android Coordinatorlayout,我有一个布局,其中我需要工具栏的上半部分和一些内容,然后是ViewPager的下半部分,它需要根据布尔值隐藏 XML的框架如下所示: <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

我有一个布局,其中我需要工具栏的上半部分和一些内容,然后是
ViewPager
的下半部分,它需要根据布尔值隐藏

XML的框架如下所示:

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"/>

        <androidx.coordinatorlayout.widget.CoordinatorLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.google.android.material.appbar.AppBarLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

                <com.google.android.material.appbar.CollapsingToolbarLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:expandedTitleGravity="bottom|center_horizontal"
                    app:layout_scrollFlags="scroll">

                    <androidx.constraintlayout.widget.ConstraintLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:layout_collapseMode="none">

                        <TextView
                            style="@style/Medium.ExtraLarge"
                            android:layout_width="0dp"
                            android:layout_height="wrap_content"
                            tools:text="Title Something" />

                       <!--Other top section content --> 

                    </androidx.constraintlayout.widget.ConstraintLayout>

                </com.google.android.material.appbar.CollapsingToolbarLayout>

            </com.google.android.material.appbar.AppBarLayout>


            <androidx.viewpager.widget.ViewPager
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="@{(viewModel.isInBusinessManagement &amp;&amp; (viewModel.hasActivePremium || viewModel.hasSuspendedPlan)) ? View.VISIBLE : View.GONE}"
                app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
                app:layout_collapseMode="pin"
                tools:visibility="gone">

                <com.google.android.material.tabs.TabLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/tab_background_2dp"
                    android:visibility="@{(viewModel.isInBusinessManagement &amp;&amp; (viewModel.hasActivePremium || viewModel.hasSuspendedPlan)) ? View.VISIBLE : View.GONE}"
                    app:layout_collapseMode="pin"
                    app:layout_scrollFlags="scroll|exitUntilCollapsed"
                    app:tabGravity="fill"
                    app:tabMode="fixed"
                    app:tabSelectedTextColor="@color/colorPrimary"
                    app:tabTextAppearance="@style/tab_text"
                    app:tabTextColor="@color/txtColorGrey" />


            </androidx.viewpager.widget.ViewPager>


        </androidx.coordinatorlayout.widget.CoordinatorLayout>
    </LinearLayout>



正如您所看到的,我必须基于布尔值控制
ViewPager
TabLayout
的可见性,为此我使用了数据绑定

布局都很好,当需要显示时,我得到了预期的行为,但问题是当提到的条件(即
viewModel.isInBusinessManagement&&;(viewModel.hasActivePremium | | viewModel.hasuspendplan)
为false,Viewpager和TabLayout不可见,但占用的空间与可见时相同

现在我知道
View.INVISIBLE
有这种行为,但我显然是在用
View.GONE
来表示
false
的情况

另外,当我在根
Linearlayout
AppbarLayout
CoordinatorLayout
上放置不同颜色时,底部的额外空间似乎来自
CoordinatorLayout


您能帮我一下吗?

viewpager
可见性
消失时,您可以停止滚动工具栏

noScroll
布局中的标志\u滚动标志将停止滚动
折叠工具栏布局

<com.google.android.material.appbar.CollapsingToolbarLayout
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     app:expandedTitleGravity="bottom|center_horizontal"
     app:layout_scrollFlags="@{(viewModel.isInBusinessManagement &amp;&amp; (viewModel.hasActivePremium || viewModel.hasSuspendedPlan)) ? scroll : noScroll}">

我试图在本地解决这个问题,下面的代码对我很有用。您也可以尝试以下方法:

  • 制作一个绑定适配器,该适配器将包含用于可见性的逻辑
  • 并将坐标布局的高度设置为
    wrap\u parent

  • 我认为只有从第五步的改变,你可以在现有的代码中实现结果。上述4个步骤是通过在绑定适配器中写入逻辑来更好地利用数据绑定。

    您能否尝试将
    ViewPager
    放在
    FrameLayout
    中,并将
    app:layou行为
    从寻呼机传输到此布局中。。不确定这是否有助于将其发布为answer@Zain是的,运气不好。额外的空间仍然存在。请记住一点:当您隐藏这些视图时,是否可以通过编程方式从
    查看页面
    中删除
    app:layou behavior
    ,并且当您再次显示它们时,再次添加该行为。。我认为这个空间是由于
    协调布局
    行为造成的。。如果你在这方面需要帮助,请告诉我that@Zain是的,我确实怀疑额外的空间是由于
    CoordinatorLayout
    行为造成的。在查看<代码>时,尝试从<代码>viewpager
    中删除<代码>应用程序:布局行为
    ,然后再次在查看<代码>可见时以编程方式附加相同的行为是值得的,但我找不到任何方法。如果可以,请帮助我。要删除它:
    ViewPager ViewPager=findviewbyd(R.id.ViewPager);CoordinatorLayout.LayoutParams coordinatorParams=(CoordinatorLayout.LayoutParams)viewpager.getLayoutParams();coordinatorParams.setBehavior(空)无法导入
    滚动标志
    以使用
    滚动
    无滚动
    视图.消失
    视图.可见
    执行
    val params=layoutViewPager.colling.layoutParams作为AppBarLayout.layoutParams;params.scrollFlags=0;layoutViewPager.Collaving.layoutParams=params
    不起作用Hermay b这对您有帮助:虽然此答案已获得赏金,但此答案无法解决问题
    
    @BindingAdapter(value = ["hasActivePremium", "isInBusinessManagement", "hasSuspendedPlan"], requireAll = true)
       fun controlVPVisibility(view: ViewPager, hasActivePremium: Boolean, isInBusinessManagement:Boolean, hasSuspendedPlan:Boolean) {
            view.visibility = if(isInBusinessManagement && (hasActivePremium || hasSuspendedPlan))  View.VISIBLE else View.GONE````<br/>
        }
    
        var isInBusinessManagement = MutableLiveData<Boolean>()
        var hasActivePremium = MutableLiveData<Boolean>()
        var hasSuspendedPlan = MutableLiveData<Boolean>()
    
        <androidx.viewpager.widget.ViewPager
                    android:id="@+id/vpager"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@color/teal_700"
                    isInBusinessManagement="@{viewModel.isInBusinessManagement()}"
                    hasActivePremium="@{viewModel.hasActivePremium}"
                    hasSuspendedPlan="@{viewModel.hasSuspendedPlan}"          
                    app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"
                    app:layout_collapseMode="pin">
    
    
        binding.viewModel = viewModel
        binding.lifecycleOwner = this