横屏非全屏模式下如何在屏幕挖孔区域下方渲染Activity元素
实现方案
可以实现,不需要进入全屏模式。
你已经配置的windowLayoutInDisplayCutoutMode为shortEdges是正确的基础配置,非全屏模式下界面元素没法渲染到挖孔区域下方的核心原因是:系统默认会通过窗口安全区 inset 自动给布局内容加内边距,强制把内容推到挖孔、系统状态栏的安全区域内,只要关闭这个自动适配逻辑、自行接管安全边距处理即可。
具体操作步骤
- 第一步:关闭系统自动适配安全区
找到你的Activity对应的根布局,添加属性android:fitsSystemWindows="false",这个配置会关掉系统自动给根布局加安全边距的逻辑,此时你的布局已经可以完全绘制到挖孔区域下方,包括你说的标题面板等元素。 - 第二步:手动处理需要避开挖孔的控件边距
关闭自动适配后,系统不会再帮你把内容挪出挖孔区域,你需要手动获取挖孔区的尺寸,给不能被挖孔遮挡的控件加上对应方向的边距即可,其余装饰性内容、背景可以直接铺在挖孔区域下方。
以Kotlin代码为例,监听窗口inset拿到挖孔参数即可完成适配:val rootContainer = window.decorView rootContainer.setOnApplyWindowInsetsListener { _, insets -> // 获取屏幕挖孔信息 val displayCutout = insets.displayCutout // 横屏左侧挖孔对应的安全边距宽度 val cutoutLeftPadding = displayCutout?.safeInsetLeft ?: 0 // 给标题面板加左侧内边距,避开挖孔位置 titlePanel.setPadding(cutoutLeftPadding, 0, 0, 0) insets }
注意事项
- 该适配逻辑从API 28(Android 9)开始生效,不需要额外添加全屏相关的Window flags,保留状态栏/导航栏的非全屏状态下也能正常运行。
- 如果你使用Jetpack WindowManager库做跨版本适配,核心逻辑一致:关闭系统默认的内容安全边距适配,自行根据获取到的挖孔/折叠屏安全区参数,给需要避让的控件设置边距即可。
- 你当前已经实现的背景延伸效果参考:

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

