Android 13模态底部弹窗显示时Scrim未覆盖状态栏求助
解决Android 13模态底部弹窗Scrim不覆盖状态栏的问题
方案一:动态修改BottomSheetDialog的Window参数
在显示弹窗前,直接配置其Window属性,强制让遮罩延伸到状态栏:
val bottomSheetDialog = BottomSheetDialog(context, R.style.BottomSheetDialogTheme) bottomSheetDialog.window?.apply { // 将状态栏设为透明,让Scrim透出来 statusBarColor = ContextCompat.getColor(context, android.R.color.transparent) // 允许Window延伸到状态栏区域 setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS ) // 反转状态栏图标颜色,适配深色Scrim decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() } bottomSheetDialog.show()
方案二:完善ThemeOverlay配置
在自定义的bottomSheetDialogTheme中补充针对Android 13的属性:
<style name="BottomSheetDialogTheme" parent="ThemeOverlay.MaterialComponents.BottomSheetDialog"> <item name="android:statusBarColor">@android:color/transparent</item> <!-- 允许Dialog窗口覆盖刘海/状态栏区域 --> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowTranslucentStatus">true</item> <!-- 关闭浅色状态栏图标,适配深色Scrim --> <item name="android:windowLightStatusBar">false</item> <!-- 自定义Scrim颜色(默认半透明黑可设为#80000000) --> <item name="scrimColor">@color/custom_scrim_color</item> </style>
方案三:BottomSheetDialogFragment场景适配
如果使用BottomSheetDialogFragment,在onCreateDialog方法中做配置:
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog dialog.window?.apply { statusBarColor = ContextCompat.getColor(requireContext(), android.R.color.transparent) setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS ) decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() } return dialog }
核心原因
Android 13对窗口布局的限制更严格,默认情况下BottomSheetDialog的窗口不会延伸到状态栏区域,导致Scrim无法覆盖。通过设置FLAG_LAYOUT_NO_LIMITS让窗口扩展至全屏,配合透明状态栏,就能让Scrim覆盖状态栏,同时调整图标颜色保证可读性。
内容的提问来源于stack exchange,提问作者Eddie
相关产品推荐
相关产品推荐

