从 Android 15 开始,Google 强制启用 Edge-to-Edge(全屏/沉浸式)设计,应用的内容会扩展到屏幕四周,包括 状态栏、导航栏 以及 通知栏 区域。
这意味着以前我们习惯的:
window.statusBarColor = Color.RED
在 Android 15 上将被废弃且不生效,状态栏颜色不再通过 statusBarColor 直接修改。
Android Studio 也会提示:
Draw proper background behind WindowInsets.Type.statusBars() instead.
即需要通过绘制状态栏区域的背景来实现颜色效果,而不是直接调用 statusBarColor。
2. 什么是 Edge-to-Edge?
Edge-to-Edge(全屏沉浸式设计)是一种让内容延伸到设备屏幕边缘的 UI 风格,视觉上更加沉浸、现代化。
之前 Android 允许我们用 fitsSystemWindows 来留出状态栏/导航栏区域,但 Android 15 起,Google 鼓励直接绘制到这些区域,由开发者自己管理间距与背景。
参考图示:
- 旧模式:状态栏和导航栏区域有固定背景色,内容下移
- 新模式:内容可以绘制到状态栏/导航栏区域,开发者自己决定留白和背景
3. statusBarColor 废弃后的替代方案
官方推荐
在 状态栏的 WindowInsets 区域 绘制你想要的背景。
核心思路是:
- 获取状态栏的高度(通过
WindowInsets)。 - 在该区域绘制一层背景色(View 或自定义布局)。
- 内容区域根据需要加
padding避开状态栏文字。
示例代码:
ViewCompat.setOnApplyWindowInsetsListener(rootView) { v, insets ->
val statusBarInsets = insets.getInsets(WindowInsetsCompat.Type.statusBars())
statusBarBackgroundView.layoutParams.height = statusBarInsets.top
statusBarBackgroundView.setBackgroundColor(Color.RED)
insets
}
statusBarBackgroundView 是你在布局里放在最上面的一个背景 View,用来替代 statusBarColor。
4. 临时解决方案(不推荐长期使用)
如果项目暂时没有时间完全适配 Edge-to-Edge(状态栏、导航栏透明绘制),可以通过以下方式在 Android 15+ 上保留旧的 statusBarColor 逻辑。
res/values-v35/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.MyTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
<!-- 旧逻辑设置状态栏颜色 -->
<item name="android:statusBarColor">@color/primary_color</item>
<!-- 退出 Edge-to-Edge 强制 -->
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
</style>
</resources>
并在 AndroidManifest.xml 中引用该主题:
<application
android:theme="@style/Theme.MyTheme"
... >
</application>
这样 在 Android 15 上仍然会按老逻辑工作,方便快速兼容。
但注意:
- 该属性未来会被移除(官方已明确标记为即将弃用)。
- 只是为了给开发者一个过渡期,长期还是要改成
WindowInsets绘制方式。
5. 迁移建议
| 时间阶段 | 做法 |
|---|---|
| 短期(快速上线) | 使用 android:windowOptOutEdgeToEdgeEnforcement="true"保留旧行为 |
| 中期(逐步适配) | 逐屏调整 UI,将状态栏/导航栏背景改为通过 View 绘制 |
| 长期(完全适配) | 采用完整 Edge-to-Edge 设计,内容延伸到四周,背景和间距由开发者全权管理 |
6. 总结
- Android 15 起,
statusBarColor被废弃,不能直接修改状态栏颜色。 - 官方建议通过 WindowInsets 绘制背景 来控制状态栏样式。
- 可以用
windowOptOutEdgeToEdgeEnforcement作为过渡方案,但要尽快迁移。 - Edge-to-Edge 是未来趋势,提前适配可以让 App 在新系统上视觉体验更好。