如何在Fragment打开/关闭时修改状态栏图标颜色 兼容全Android版本
全版本兼容的状态栏图标颜色修改及问题修复方案
通用全版本适配实现
Android 6.0(API 23)及以上系统支持修改状态栏图标颜色,API 23以下系统默认状态栏图标为白色,无需额外适配,只要保证状态栏背景为深色即可。以下是覆盖所有支持改色版本的工具方法:
Kotlin 扩展方法
fun Activity.setStatusBarIconDark(isDark: Boolean) { when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { window.insetsController?.setSystemBarsAppearance( if (isDark) WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS else 0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS ) } Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> { window.decorView.systemUiVisibility = if (isDark) { window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR } else { window.decorView.systemUiVisibility and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() } } } }
Java 工具方法
public static void setStatusBarIconDark(Activity activity, boolean isDark) { if (activity.getWindow() == null) return; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { WindowInsetsController controller = activity.getWindow().getInsetsController(); if (controller != null) { if (isDark) { controller.setSystemBarsAppearance(WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); } else { controller.setSystemBarsAppearance(0, WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS); } } } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { View decorView = activity.getWindow().getDecorView(); int vis = decorView.getSystemUiVisibility(); if (isDark) { vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; } else { vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; } decorView.setSystemUiVisibility(vis); } }
Bottom Sheet 场景异常修复方案
你遇到的问题根源是第二个Bottom Sheet Fragment弹出时修改了状态栏配置,关闭时没有还原状态,两种修复方案可选:
- 在第一个Fragment的
onResume生命周期主动调用上述工具方法,设置当前页面对应的状态栏样式,无论从什么页面返回都能自动恢复正确状态:
override fun onResume() { super.onResume() // 白色状态栏背景需要深色图标传true,深色状态栏背景需要白色图标传false requireActivity().setStatusBarIconDark(true) }
- 在第二个Bottom Sheet Fragment的
onDismiss回调里主动还原状态栏配置:
override fun onDismiss(dialog: DialogInterface) { super.onDismiss(dialog) activity?.setStatusBarIconDark(true) }
注意事项
- 若使用Material Design组件库的Bottom Sheet,检查是否修改了Dialog的
windowIsFloating属性或者Window flag,这类全局Window配置修改后未还原也会触发状态栏异常 - API 23以下设备不支持深色状态栏图标,建议这类设备统一使用深色状态栏背景,避免图标和背景撞色
内容的提问来源于stack exchange,提问作者Debayan Ghosh Dastider
相关产品推荐
相关产品推荐

