Android 沉浸式状态栏
1. 什么是沉浸式状态栏
Android 里常说的“沉浸式状态栏”,其实包含几类需求:
以前大家说“沉浸式状态栏”,更多是指:
状态栏透明 + 顶部布局延伸到状态栏下面。
现在更准确的说法应该是:
Edge-to-edge + WindowInsets 适配。
2. Android 各版本是如何解决的
Android 官方现在明确说明:target SDK 35 后,在 Android 15 设备上应用会默认 edge-to-edge,内容会绘制到状态栏、导航栏后面;如果没有处理 Insets,UI 可能被遮挡。Android edge-to-edge 文档
3. 老版本为什么难适配
老版本难适配,不是因为代码复杂,而是因为系统能力不完整。
比如:
所以新的 SDK 可以统一很多写法,但不能让老系统凭空拥有新能力。
4. 以前的开源框架
以前做沉浸式状态栏,很多项目会用第三方框架。
这些框架当年有价值,是因为它们帮我们处理了:
Android 4.4 假状态栏。
Android 5.0 状态栏颜色。
Android 6.0 状态栏图标深浅色。
国产 ROM 差异。
Fragment / Dialog / PopupWindow 场景。
刘海屏和键盘遮挡问题。
但是现在,官方 API 已经覆盖了大部分主流需求。
5. 现在推荐的解决方案
现在新项目一般不建议再引入第三方沉浸式状态栏框架,而是使用官方方案。
核心思路是:
Activity 里开启 edge-to-edge。
页面内容允许绘制到系统栏后面。
使用 WindowInsets 给重要内容加 padding 或 margin。
顶部标题栏避开状态栏。
底部按钮、底部导航、列表最后一项避开导航栏。
需要全屏时再隐藏系统栏。
View 项目常用:
Compose 项目常用:
6. 现在兼容的重点变了
以前兼容的是:
状态栏怎么透明。
状态栏怎么变色。
状态栏图标怎么变黑。
Android 4.4 / 5.0 / 6.0 怎么分别处理。
国产 ROM 怎么适配。
现在兼容的是:
内容不要被状态栏遮住。
内容不要被导航栏遮住。
列表最后一项不要被导航栏盖住。
底部按钮不要进入手势区域。
刘海屏、横屏、折叠屏要正常。
Android 15 默认 edge-to-edge 后页面不能乱。
也就是说:
以前是“状态栏效果适配”,现在是“系统栏 Insets 适配”。
7. 推荐理解流程
.webp)
8. 实战建议
新项目建议:
不再优先引入 ImmersionBar、StatusBarUtil 这类框架。
直接使用 AndroidX 的
enableEdgeToEdge()。所有页面统一按 edge-to-edge 思路设计。
顶部 AppBar 处理状态栏高度。
底部导航、悬浮按钮、输入框处理导航栏高度。
RecyclerView、NestedScrollView 处理底部 padding。
Android 6.0 以下状态栏深色图标不支持时,用深色背景兜底。
Android 15 设备必须重点测试。
老项目建议:
如果已经用了 ImmersionBar / UltimateBarX,可以暂时保留。
新页面尽量用官方 Insets 思路写。
不要继续扩散老的假状态栏方案。
逐步把“状态栏颜色适配”迁移成“WindowInsets 适配”。
target SDK 升到 35 前,重点检查所有页面是否被状态栏、导航栏遮挡。
9. 总结
沉浸式状态栏的发展可以分成三个阶段:
最终结论:
现在不是完全不需要兼容,而是不再建议围绕“状态栏颜色”做兼容,而应该围绕 WindowInsets 做兼容。
第三方框架还有历史价值,但新项目更推荐官方方案。
老版本系统不支持的能力,只能降级处理;新 SDK 可以统一写法,但不能彻底消除老系统限制。
Android 沉浸式状态栏
https://lautung.com/archives/bqmKuXTk
评论