You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 00:36:04