Android打开BottomSheetDialog时系统导航栏颜色变黑如何解决
问题根因
原有代码仅对Activity持有的Window设置了导航栏颜色,而BottomSheetDialog作为独立弹窗组件,持有单独的Window实例,弹出时会使用自身Window的默认配置:原生BottomSheetDialog默认将导航栏颜色设为黑色,同时默认允许弹窗内容延伸到导航栏区域,会直接覆盖Activity原本的导航栏颜色设置,最终出现弹窗弹出时导航栏变黑的现象。
解决方案
方案1:单弹窗针对性设置(快速修复)
创建BottomSheetDialog实例后,直接对弹窗自身的Window设置导航栏颜色即可,修改后的弹窗代码如下:
BottomSheetDialog dialog = new BottomSheetDialog(MainActivity.this); dialog.setContentView(R.layout.sortfilterbottomsheet); dialog.setCanceledOnTouchOutside(true); // 给Dialog的Window设置和Activity一致的导航栏颜色 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { dialog.getWindow().setNavigationBarColor(getResources().getColor(R.color.navcolor)); } // Android 8.1及以上版本需要关闭系统强制导航栏对比度,避免出现半透明遮罩 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { dialog.getWindow().setNavigationBarContrastEnforced(false); } dialog.show();
方案2:自定义主题全局统一(适合多页面复用场景)
如果项目中多处使用BottomSheetDialog,可以通过自定义主题统一配置导航栏样式,避免每个弹窗重复写设置代码:
- 先在
res/values/styles.xml中定义专属BottomSheet主题:
<style name="AppBottomSheetTheme" parent="Theme.MaterialComponents.BottomSheetDialog"> <item name="android:navigationBarColor">@color/navcolor</item> <item name="android:enforceNavigationBarContrast">false</item> </style>
- 创建弹窗时传入自定义主题即可:
// 传入自定义主题 BottomSheetDialog dialog = new BottomSheetDialog(MainActivity.this, R.style.AppBottomSheetTheme); dialog.setContentView(R.layout.sortfilterbottomsheet); dialog.setCanceledOnTouchOutside(true); dialog.show();
效果参考
- BottomSheet关闭时的正常导航栏效果:

- BottomSheet打开时的异常变黑效果:

内容的提问来源于stack exchange,提问作者Pratham Jindal
相关产品推荐
相关产品推荐

