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

单Activity多Fragment架构下为指定Fragment单独设置状态栏颜色

核心实现逻辑

状态栏属于Activity的Window层级,本身无法单独绑定单个Fragment,所以只需监听Fragment的可见状态切换,动态修改Window的状态栏属性,离开特殊Fragment时恢复默认配置即可,具体实现步骤如下:


实现步骤

1. Activity封装状态栏修改方法

首先在宿主Activity中定义状态栏颜色常量和统一修改方法,暴露给Fragment调用:

import android.graphics.Color
import android.os.Build
import android.view.View
import android.view.Window
import androidx.core.view.WindowInsetsControllerCompat

class HostActivity : AppCompatActivity() {
    // 全局默认状态栏颜色(蓝色)
    private val DEFAULT_STATUS_BAR_COLOR = Color.parseColor("#FF1677FF")
    // 特殊Fragment需要的白色状态栏颜色
    private val SPECIAL_STATUS_BAR_COLOR = Color.WHITE

    // 暴露给Fragment调用的状态栏更新方法
    fun updateStatusBar(isSpecialFragment: Boolean) {
        window.statusBarColor = if (isSpecialFragment) {
            // 白色状态栏搭配深色文字,避免内容看不清
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = true
            } else {
                @Suppress("DEPRECATION")
                window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
            }
            SPECIAL_STATUS_BAR_COLOR
        } else {
            // 蓝色状态栏搭配默认浅色文字
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = false
            } else {
                @Suppress("DEPRECATION")
                window.decorView.systemUiVisibility = 0
            }
            DEFAULT_STATUS_BAR_COLOR
        }
    }
}

2. 特殊Fragment生命周期触发修改

在需要白色状态栏的Fragment的生命周期回调中触发状态栏切换,切走时自动恢复默认蓝色:

class SpecialWhiteFragment : Fragment() {
    override fun onResume() {
        super.onResume()
        //  Fragment对用户可见时切换为白色状态栏
        (requireActivity() as HostActivity).updateStatusBar(true)
    }

    override fun onPause() {
        super.onPause()
        // Fragment被遮挡/切走时恢复默认蓝色状态栏
        (requireActivity() as HostActivity).updateStatusBar(false)
    }
}

3. 多Fragment切换适配

如果项目有多个普通Fragment,建议封装公共基类,避免重复写恢复逻辑:

open class BaseNormalFragment : Fragment() {
    override fun onResume() {
        super.onResume()
        // 所有普通Fragment可见时自动恢复蓝色状态栏
        (requireActivity() as HostActivity).updateStatusBar(false)
    }
}

踩坑提示

  • 不要在Fragment的onCreateView方法中调用状态栏修改逻辑,此时Fragment未完全渲染到Activity,会出现时序异常
  • 若使用Navigation组件跳转,无需额外处理可见性,原生Fragment生命周期回调即可正常触发
  • 如果开启了沉浸式布局,需要同步调整Fragment根布局的android:fitsSystemWindows属性,避免内容被状态栏遮挡

内容的提问来源于stack exchange,提问作者Shafique Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:18:03