Android如何让RecyclerView条目显示在圆角BottomNavigationView边角区域
解决方案
1. 调整布局层级与约束
首先确认根布局使用FrameLayout或ConstraintLayout,不要让RecyclerView的底部约束对齐到BottomNavigationView的顶部,要让RecyclerView高度撑满整个父布局,内容自然延伸到BottomNavigationView下方。你当前给RecyclerView设置的paddingBottom="?android:attr/actionBarSize"可以保留,也可以调整为BottomNavigationView的高度+底部10dp边距,保证最后一条列表内容可以完全滚动到可视区域,不会被导航栏永久遮挡。
2. 修正BottomNavigationView的透明区域显示
你现在给BottomNavigationView设置了elevation,默认会按照矩形轮廓生成阴影、裁剪内容,导致圆角外的区域不透明,需要新增两个属性:
android:outlineProvider="background":让系统按照你设置的shape背景计算View的轮廓,阴影也会适配圆角android:clipToOutline="true":裁剪View内容到背景轮廓范围内,圆角外的区域变为全透明
修改后的bottom_navigation_view.xml核心代码如下:
<?xml version="1.0" encoding="utf-8"?> <com.google.android.material.bottomnavigation.BottomNavigationView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/bottom_navigation_view_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/bottom_navigation_style" android:layout_marginStart="30dp" android:layout_marginEnd="30dp" android:layout_marginBottom="10dp" app:itemIconSize="30dp" android:elevation="5dp" app:itemIconTint="@color/white" app:itemRippleColor="@android:color/transparent" app:labelVisibilityMode="unlabeled" app:menu="@menu/bottom_navigation" <!-- 新增下面两个属性 --> android:outlineProvider="background" android:clipToOutline="true"> </com.google.android.material.bottomnavigation.BottomNavigationView>
3. 关闭RecyclerView的内容裁剪
给两个页面的RecyclerView新增android:clipToPadding="false"属性,同时给RecyclerView的直接父布局新增android:clipChildren="false",保证列表滚动到最底部时,paddingBottom区域的内容不会被裁剪,能正常显示在BottomNavigationView的下方。
修改后的RecyclerView示例(以fragment_profile.xml为例):
<androidx.recyclerview.widget.RecyclerView android:id="@+id/postRecyclerViewProfile" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:paddingBottom="?android:attr/actionBarSize" android:orientation="vertical" android:overScrollMode="never" <!-- 新增属性 --> android:clipToPadding="false"/>
内容的提问来源于stack exchange,提问作者Vasant Raval
相关产品推荐
相关产品推荐

