在Android中更改状态栏颜色有多种方法,具体取决于开发需求和技术栈。以下是几种主流实现方案及扩展知识点:
1. 通过主题XML配置(推荐)
在`res/values/themes.xml`中定义主题时添加状态栏属性:
xml
需注意:
颜色值建议使用透明色或与导航栏协调的颜色
`windowLightStatusBar`控制状态栏图标颜色(true为深色,false为浅色)
2. 代码动态修改
kotlin
window.statusBarColor = ContextCompat.getColor(this, R.color.your_color)
// 设置文字/图标颜色(API 23+)
window.decorView.systemUiVisibility = if (lightIcons)
View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR else 0
3. 沉浸式状态栏
结合透明状态栏实现特殊效果:
kotlin
window.apply {
clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
statusBarColor = Color.TRANSPARENT
}
需在布局中预留状态栏高度(通过`fitsSystemWindows="true"`或手动设置padding)
4. 与WindowInsetsController配合(API 30+)
kotlin
window.insetsController?.apply {
setSystemBarsAppearance(
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
)
}
5. 第三方库方案
SystemUiController(Jetpack Compose):
kotlin
val systemUiController = rememberSystemUiController()
systemUiController.setStatusBarColor(color = Color.Red, darkIcons = true)
ImmersionBar:
java
ImmersionBar.with(this)
.statusBarColor(R.color.colorPrimary)
.statusBarDarkFont(true)
.init();
延伸知识:
色彩适配:考虑深色模式下的状态栏颜色变化,可在`res/values-night`中配置不同颜色
刘海屏适配:需通过`window.layoutInDisplayCutoutMode`处理特殊区域
动态效果:可通过ValueAnimator实现状态栏颜色渐变过渡
兼容性处理:低于API 21需降级处理,API 23以下无法修改状态栏图标颜色
实际开发中建议优先使用Material Design 3的`DynamicColor`方案,自动适配系统主题色。注意测试不同厂商的ROM(如MIUI、EMUI)可能存在的兼容性问题,部分系统需要额外调用厂商特定API。