You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:39:03