如何在其他Fragment中取消UI全屏状态?
解决办法
核心逻辑
Activity的SystemUiVisibility是全局生效的,不能在Activity里一劳永逸设置,得在每个Fragment的生命周期里单独调整,再配合布局的fitSystemWindows属性控制内容是否延伸到状态栏区域。
第一步:捋顺Activity基础配置
先在Activity的主题里做基础设置,避免默认样式冲突:
- 主题用
Theme.MaterialComponents.Light.NoActionBar(如果用自定义Toolbar),或者保留原生ActionBar但不要加全局状态栏配置 - 别在Activity的
onCreate里全局设置SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,把控制权交给每个Fragment
第二步:第一个Fragment(全屏延伸状态栏)
在这个Fragment的onViewCreated里设置状态栏模式,同时配置布局:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 开启全屏布局延伸 (activity as AppCompatActivity).run { window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 不需要ActionBar就隐藏,需要则保留 supportActionBar?.hide() } // 布局根节点必须设置 android:fitSystemWindows="false",让内容延伸到状态栏下方 } // 可选:Fragment销毁时恢复ActionBar显示,方便后续Fragment使用 override fun onDestroyView() { super.onDestroyView() (activity as AppCompatActivity).supportActionBar?.show() }
第三步:其余Fragment(正常状态栏+ActionBar)
在这些Fragment的onViewCreated里恢复正常状态,解决重叠问题:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 恢复状态栏稳定布局,取消全屏延伸 (activity as AppCompatActivity).run { window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE supportActionBar?.show() } // 布局根节点设置 android:fitSystemWindows="true",系统会自动给内容添加状态栏高度的padding,避免与ActionBar重叠 }
踩坑细节补充
- 别用
View.GONE修改状态栏,这会导致系统重新计算布局高度,直接出现状态栏翻倍、空行这类问题,要用SYSTEM_UI_FLAG_LAYOUT_*系列flag控制布局延伸,而非隐藏状态栏本身 - 如果用自定义Toolbar,确保Toolbar是布局顶部节点,配合
fitSystemWindows="true",系统会自动给根布局添加状态栏高度的padding,避免内容与Toolbar重叠 - 若仍出现状态栏与ActionBar的间隙,检查主题中
android:statusBarColor是否设为透明,仅在第一个Fragment中设置window.statusBarColor = Color.TRANSPARENT即可,其余Fragment恢复默认颜色
内容的提问来源于stack exchange,提问作者Tommy -
相关产品推荐
相关产品推荐

