Android自定义Toolbar运行时遮挡RecyclerView等页面内容问题求助
问题根因
- 你使用
RelativeLayout作为根布局,app:layout_behavior属性仅对CoordinatorLayout的子控件生效,你给include的Toolbar和item布局里的RelativeLayout加该属性完全无效,不会产生预期的位置偏移效果 - 你应用的主题大概率是带
windowNoTitle、windowActionBar=false属性的无ActionBar主题,根布局未设置android:fitsSystemWindows="true",导致Toolbar直接顶到状态栏下方,RelativeLayout的布局计算没有把系统状态栏高度算入,最终layout_below的偏移量不足 - 你自定义的Toolbar高度设为
wrap_content,运行时实际渲染高度和设计视图的预估值不一致,也会导致相对布局的位置计算偏差
修复方案
方案一:沿用RelativeLayout的最小修改
修改activity_main.xml,给根布局添加fitsSystemWindows属性,删除无效的behavior属性:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:fitsSystemWindows="true" android:paddingLeft="8dp" android:paddingRight="8dp"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/toolbar" android:background="@android:color/darker_gray" android:padding="4dp" android:scrollbars="vertical" /> </RelativeLayout>
修改toolbar.xml,给Toolbar明确设置最小高度,避免wrap_content带来的高度计算偏差:
<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="@color/purple_200" android:elevation="4dp"> <!-- 内部原有布局内容保持不变 --> </androidx.appcompat.widget.Toolbar>
方案二:使用标准Material组件组合(更推荐,后续扩展滚动效果更方便)
把根布局替换为CoordinatorLayout+AppBarLayout的官方标准组合,修改后的activity_main.xml如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" android:paddingLeft="8dp" android:paddingRight="8dp"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <include android:id="@+id/toolbar" layout="@layout/toolbar" /> </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:background="@android:color/darker_gray" android:padding="4dp" android:scrollbars="vertical" /> </androidx.coordinatorlayout.widget.CoordinatorLayout>
该方案中appbar_scrolling_view_behavior加给RecyclerView才是正确用法,会自动让RecyclerView位于AppBarLayout下方,不需要额外添加相对布局约束。
额外注意事项
- 你之前加在
example_item.xml里RelativeLayout的app:layout_behavior属性无任何作用,直接删除即可,避免冗余 - 不要同时混用RelativeLayout的
layout_below和ConstraintLayout的约束属性,你之前在RecyclerView中同时添加了两种属性,仅会生效对应父布局支持的那一种,多余属性直接删除避免混淆 - 检查
AndroidManifest.xml中对应Activity的主题,确认是继承自无ActionBar的主题即可,不需要额外修改主题配置
内容的提问来源于stack exchange,提问作者Overflowist
相关产品推荐
相关产品推荐

