Android 15中打开BottomSheet时导航栏出现黑色条带问题
Android 15 BottomSheet底部出现额外条带问题
升级到Android 15后,应用内多个BottomSheet打开时底部会显示一条不属于BottomSheet的额外条带(截图:
)。该问题仅在Android 15设备上出现,Android 14及以下版本表现正常。
当前应用使用的主题代码如下:
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge"> <!-- Customize your theme here. --> <item name="colorPrimary">@android:color/white</item> <item name="colorAccent">@android:color/black</item> <item name="android:statusBarColor">@color/white_2</item> <item name="android:windowLightStatusBar" tools:ignore="NewApi">true</item> <item name="android:defaultFocusHighlightEnabled" tools:targetApi="o">false</item> <item name="android:windowActivityTransitions">true</item> <item name="bottomSheetDialogTheme">@style/BottomSheetDialogTheme2</item> </style> <style name="BottomSheetDialogTheme2" parent="Theme.Design.Light.BottomSheetDialog"> <item name="android:windowIsFloating">false</item> <item name="bottomSheetStyle">@style/AppModalStyle2</item> <item name="colorPrimary">@android:color/white</item> <item name="colorAccent">@android:color/black</item> </style> <style name="AppModalStyle2" parent="Widget.Design.BottomSheet.Modal"> <item name="android:background">@drawable/top_corners</item> </style>
已尝试Android 15官方行为变更文档中的方法,也试过setNavigationBarColor(该方法已废弃),均未解决问题。
解决方案
1. 适配Android 15窗口Insets规则
Android 15对非边缘到边缘窗口的导航栏处理逻辑有调整,需在BottomSheet主题中明确配置Insets相关属性:
在BottomSheetDialogTheme2中添加以下配置:
<item name="android:windowDecorFitsSystemWindows">false</item> <item name="android:navigationBarColor">@android:color/transparent</item> <!-- 针对Android 15+配置Insets控制器 --> <item name="android:windowInsetsController">@style/BottomSheetInsetsController</item>
同时添加Insets控制器样式:
<style name="BottomSheetInsetsController" parent=""> <item name="android:hideNavigationBar">true</item> <item name="android:navigationBarContrastEnforced">false</item> </style>
2. 升级Material Components主题依赖
当前使用的Theme.Design.Light.BottomSheetDialog属于旧版Design库,建议切换到Material Components的官方主题,确保适配Android 15新特性:
修改BottomSheetDialogTheme2的父主题:
<style name="BottomSheetDialogTheme2" parent="Theme.MaterialComponents.BottomSheetDialog"> <item name="android:windowIsFloating">false</item> <item name="bottomSheetStyle">@style/AppModalStyle2</item> <item name="colorPrimary">@android:color/white</item> <item name="colorAccent">@android:color/black</item> <!-- 加入Insets适配配置 --> <item name="android:windowDecorFitsSystemWindows">false</item> <item name="android:navigationBarColor">@android:color/transparent</item> </style>
3. 代码层手动处理Insets
若主题配置无效,可在BottomSheetDialog的onCreate方法中直接控制Insets:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) { window?.insetsController?.apply { hide(WindowInsets.Type.navigationBars()) systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } } window?.setNavigationBarColor(Color.TRANSPARENT) }
4. 检查BottomSheet布局高度
确保BottomSheet的根布局高度设置为match_parent,并添加fitsSystemWindows属性:
android:layout_height="match_parent" android:fitsSystemWindows="true"
内容的提问来源于stack exchange,提问作者Diaz diaz
相关产品推荐
相关产品推荐

