【发布时间】:2021-04-04 16:43:24
【问题描述】:
我有一个布局,我需要工具栏的上部和一些内容,然后是 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 && (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 && (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 &amp;&amp; (viewModel.hasActivePremium || viewModel.hasSuspendedPlan) 为 false,Viewpager 和 TabLayout 不可见,但占用的空间与可见时一样多。
现在我知道View.INVISIBLE 具有这种行为,但我显然将View.GONE 用于false 案例。
此外,当我在根Linearlayout、AppbarLayout 和CoordinatorLayout 上放置不同的颜色时,底部的额外空间似乎来自CoordinatorLayout。
你能帮我解决这个问题吗?
【问题讨论】:
-
您可以尝试将
ViewPager放在FrameLayout中,然后将app:layout_behavior从寻呼机转移到此布局.. 不确定这是否有助于将其作为答案发布 -
@Zain 我做到了,没有运气。多余的空间还在
-
记住一点:当你隐藏这些视图时,你能以编程方式从
ViewPager中删除app:layout_behavior,当你再次显示它们时,再次添加行为.. 我认为这个空间是由于CoordinatorLayoutBehavior.. 如果您需要帮助,请告诉我 -
@Zain 是的,我确实怀疑额外的空间是由于
CoordinatorLayout行为造成的。尝试在视图GONE上从viewpager中删除app:layout_behavior并再次以编程方式在视图VISIBLE上附加相同的内容是值得的,但我找不到任何方法来做到这一点。如果可以的话,请帮帮我。 -
删除它:
ViewPager viewpager = findViewById(R.id.viewpager); CoordinatorLayout.LayoutParams coordinatorParams = (CoordinatorLayout.LayoutParams) viewpager.getLayoutParams(); coordinatorParams.setBehavior(null);
标签: android android-layout android-viewpager android-coordinatorlayout