Android 14下BottomSheetDialog无背景遮罩(Dim)问题求助
Android 14下BottomSheetDialog无背景遮罩(Dim)问题求助
你好,我刚好也碰到过Android 14上BottomSheetDialog遮罩消失的问题,这是因为Android 14对Dialog的窗口属性逻辑做了调整,只设置android:backgroundDimEnabled="true"确实不会生效,试试下面这几个解决方案:
方案一:通过主题显式配置遮罩参数
在你的DialogStyle主题里,除了backgroundDimEnabled,还需要加上backgroundDimAmount属性,指定遮罩的透明度:
<style name="DialogStyle" parent="Theme.Design.Light.BottomSheetDialog"> <item name="android:windowIsFloating">false</item> <item name="android:statusBarColor">@android:color/transparent</item> <item name="android:windowSoftInputMode">adjustResize</item> <item name="android:windowBackground">@android:color/transparent</item> <item name="bottomSheetStyle">@style/RoundedBottomSheet</item> <!-- 添加这两个属性 --> <item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimAmount">0.5</item> <!-- 取值0-1,0完全透明,1完全不透明,可按需调整 --> </style>
方案二:代码中动态设置遮罩
如果主题配置还是不生效,可以在创建BottomSheetDialog之后,通过Window对象强制开启遮罩并设置透明度:
Kotlin代码:
val dialog = BottomSheetDialog(requireContext(), R.style.DialogStyle) dialog.window?.apply { setDimAmount(0.5f) addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) } // 后续显示dialog的逻辑 dialog.show()
Java代码:
BottomSheetDialog dialog = new BottomSheetDialog(getContext(), R.style.DialogStyle); Window window = dialog.getWindow(); if (window != null) { window.setDimAmount(0.5f); window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); } dialog.show();
方案三:排查样式冲突
可以暂时注释掉RoundedBottomSheet里的动画属性,测试下是不是动画导致遮罩被意外隐藏:
<style name="RoundedBottomSheet" parent="Widget.Design.BottomSheet.Modal"> <item name="android:background">@android:color/transparent</item> <!-- 暂时注释动画测试 --> <!-- <item name="android:windowEnterAnimation">@anim/popup_window_enter_animation</item> --> <!-- <item name="android:windowExitAnimation">@anim/popup_window_exit_animation</item> --> </style>
原因说明
Android 14对BottomSheetDialog的窗口初始化逻辑做了优化,默认情况下可能不再自动启用背景遮罩,必须显式指定FLAG_DIM_BEHIND和遮罩透明度才能让遮罩正常显示,这就是之前只加backgroundDimEnabled没用的原因。
备注:内容来源于stack exchange,提问作者DanielOk
相关产品推荐
相关产品推荐

