如何让TabLayout关联的Fragment完全适配ViewPager内部的显示高度
问题根源
布局错位、FAB显示不全、Toolbar被顶上去的问题,核心是AppBarLayout的滚动行为(appbar_scrolling_view_behavior)被错误添加到了非滚动容器上,同时重复嵌套滚动行为导致整体高度计算异常。
具体修改方案
1. 修改父Fragment(带TabLayout/ViewPager的布局)
修改点:
- 移除
TabLayout上的app:layout_behavior="@string/appbar_scrolling_view_behavior",这个属性是给AppBarLayout下方的滚动内容使用的,不能加在AppBarLayout内部的子控件上 - 移除ViewPager上无效的
android:layout_below="@id/tabLayoutInputDataTypes",CoordinatorLayout不支持RelativeLayout的位置属性,这个声明不会生效,反而会干扰布局计算
修改后核心代码参考:
<!-- TabLayout修改后 --> <com.google.android.material.tabs.TabLayout android:id="@+id/tabLayoutInputDataTypes" android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" android:background="@color/BrightYellowCrayola" /> <!-- ViewPager修改后 --> <androidx.viewpager2.widget.ViewPager2 app:layout_behavior="@string/appbar_scrolling_view_behavior" android:id="@+id/viewPagerInputDataTypes" android:layout_width="match_parent" android:layout_height="match_parent" />
2. 修改子Fragment的布局
修改点:
- 移除子Fragment中RecyclerView的
app:layout_behavior="@string/appbar_scrolling_view_behavior",外层的ViewPager已经配置了和AppBarLayout联动的行为,子控件重复添加会导致滚动偏移量叠加,内容被挤出可视区域 - 可选优化:如果不需要子Fragment内部的CoordinatorLayout做额外的联动效果,可以直接换成
LinearLayout或者FrameLayout作为根布局,减少不必要的布局嵌套
修改后核心代码参考:
<!-- RecyclerView修改后 --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/rvListIncomeType" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingStart="@dimen/zero_margin_when_normal" android:paddingEnd="@dimen/zero_margin_when_normal" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
额外校验点
如果修改后仍有滚动冲突,可按需调整Toolbar的滚动标志:当前app:layout_scrollFlags="scroll|enterAlways"是正常的,要是不需要Toolbar随着列表滚动隐藏,直接删掉这个属性即可,Toolbar就会固定在顶部不会被拖动。
内容的提问来源于stack exchange,提问作者Funny Moments
相关产品推荐
相关产品推荐

