加速湾顶部状态栏修复报错

问题是两个修改一起做的,为了精准定位元凶,让我逐步还原:

先确认一下 — 当前 光晕 View 已移除 + 窗口配置在 setContentView 后重刷,遮罩消失了对吧?那我来定位:

真正罪魁祸首是:isSystemBarsTranslucentCompat = true 的调用时机错误。

核心原因:

kotlin
// BaseActivity.onCreate()
applyDayNight() // ← 这里调用 setDecorFitsSystemWindows(false)
safeScope.launch { main() } // ← 协程里才 setContentView
setDecorFitsSystemWindows(false) 在 setContentView 之前被调用。此时 decorView 尚未完全就绪,系统可能在 setContentView 时将 decorView 状态重置,导致 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 和 edge-to-edge 设置失效。

失效后系统的行为是:内容不延伸到状态栏后面 → 状态栏区域暴露了 AppThemeDarkBase 主题的 android:windowBackground = #000000(纯黑),叠加在已渲染的布局之上,就形成了你看到的「透明黑色遮罩/一层皮」。

为什么 LoginActivity 没问题?因为它 先 setContentView 再 applyDayNight()——时序正确。

修复就是在 setContentDesign(即 setContentView 完成)之后补了一次窗口配置:

kotlin
setContentDesign(design)
// ↓ 在 setContentView 完成后再刷一次,确保生效
window.isSystemBarsTranslucentCompat = true
window.statusBarColor = Color.TRANSPARENT
window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
光晕 View 也可以还原回去,不是它们的问题。要我把光晕还原吗?

一击命中修复
把 applyDayNight() 调用从 onCreate 里删掉,移到 setContentDesign() 里 this.design = design(即 setContentView)之后:

code
// BaseActivity.kt

// onCreate 里:删掉 applyDayNight()

// setContentDesign 里,加一行:
this.design = design // 触发 setContentView()
applyDayNight() // ← 在这之后调,时序就对了

当前四文件修改状态总结:

文件修改内容状态
BaseActivity.ktapplyDayNight() 从 onCreate() 移到 setContentDesign() 内部(setContentView 之后)
MainActivity.kt删除了 setContentDesign 前冗余的窗口透明配置代码
design_main.xml移除了4个光晕View + status_bar_background
MainDesign.kt注释掉了光晕和status_bar_background的 findViewById 调用

上次构建错误是 color_light_background / color_error 资源找不到 — 这是 design/build 缓存损坏导致的误报,源码中颜色定义是存在的。app/build 和 design/build 已清理,重新构建后应该能通过。

构建成功后装到设备上测试,看状态栏遮罩是否消失。

世界树

一步一步来

您可能还喜欢...