加速湾顶部状态栏修复报错
问题是两个修改一起做的,为了精准定位元凶,让我逐步还原:
先确认一下 — 当前 光晕 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.kt | applyDayNight() 从 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 已清理,重新构建后应该能通过。
构建成功后装到设备上测试,看状态栏遮罩是否消失。