Android全屏应用CutoutMode下PopUpWindow不遵循全屏配置如何解决
根因说明
PopupWindow属于独立于宿主Activity的窗口,默认不会继承Activity的全屏、挖孔适配、沉浸状态栏等窗口配置,因此内容无法覆盖系统栏、挖孔区域,导致对应位置没有灰色遮罩。你不需要找PopupWindow的decorView,直接操作它的contentView即可配置窗口规则。
解决方案
在你原有的PopupWindow初始化代码后、showAtLocation调用前,加入如下配置代码即可:
// 关闭内容裁剪,允许窗口延伸到屏幕所有区域 popupWindow.isClippingEnabled = false // 禁止contentView适配系统窗口,避免自动加padding popupWindow.contentView.fitsSystemWindows = false // 配置窗口参数,适配挖孔屏与全屏 val windowParams = popupWindow.contentView.layoutParams as? WindowManager.LayoutParams windowParams?.let { params -> // 允许窗口布局延伸到系统栏区域 params.flags = params.flags or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS // Android P及以上适配挖孔屏,内容延伸到挖孔区域 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { params.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES } popupWindow.contentView.layoutParams = params } // 给PopupWindow应用和Activity一致的全屏沉浸配置 with(WindowInsetsControllerCompat(window, popupWindow.contentView)) { systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE hide(Type.systemBars()) }
补充注意事项
- 检查你的自定义布局
R.layout.view_change_name的根节点,不要设置android:fitsSystemWindows="true",否则会自动叠加状态栏/挖孔区域的内边距,导致遮罩无法覆盖对应区域。 - 若使用半透明背景,确保背景属性设置在布局的根节点上,不要设置到子控件。
内容的提问来源于stack exchange,提问作者kuzdu
相关产品推荐
相关产品推荐

