在Android中设置状态栏涉及多方面配置,主要包括颜色、透明度、图标样式及交互行为。以下是具体实现方式和扩展知识:
1. 修改状态栏背景色
- 原生API(5.0+)
使用`Window#setStatusBarColor(int color)`,需配合`FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS`标志:
java
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.status_bar));
- 沉浸式状态栏
通过`SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN`使内容延伸至状态栏,需在布局根部设置`android:fitsSystemWindows="true"`避免重叠。
2. 控制状态栏图标颜色(6.0+)
- 浅色背景需深标:
java
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
- 默认为白标,此特性需设备支持。
3. 动态隐藏/显示状态栏
- 全屏模式:
java
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
);
- 手势交互模式下可通过`setOnSystemUiVisibilityChangeListener`状态变化。
4. 刘海屏/挖孔屏适配
- 使用`WindowInsets`获取刘海区域,避免内容被遮挡:
java
ViewCompat.setOnApplyWindowInsetsListener(view, (v, insets) -> {
Insets cutout = insets.getInsets(WindowInsetsCompat.Type.displayCutout());
v.setPadding(cutout.left, cutout.top, cutout.right, 0);
return insets;
});
5. 透明状态栏(4.4+)
java
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
);
- 需注意系统导航栏可能同步透明,建议结合`fitsSystemWindows`调整布局。
6. Material Design 3扩展
- 使用`Theme.Material3.DayNight`主题时,状态栏会自动适配动态颜色,可通过`colorSurfaceContainer`等属性精细控制层级。
7. 第三方库方案
- ImmersionBar:简化沉浸式实现,支持状态栏与导航栏联动配置。
- SystemUiController(Compose):在Jetpack Compose中通过`rememberSystemUiController()`动态调整。
注意事项:
测试时需覆盖不同Androi本及厂商ROM(如MIUI、EMUI可能有优先级更高的主题设置)。
Android 11+的沉浸式手势导航需处理`WindowInsets.Type.systemBars()`与`WindowInsets.Type.mandatorySystemGestures()`的冲突。
状态栏设计不仅要符合视觉规范,还需考虑无障碍访问(如高对比度模式下的可见性)。