单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
相关产品推荐
相关产品推荐

