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

使用Window Insets替代废弃SystemUiVisibility实现全屏时ActionBar仍显示问题

问题原因

WindowInsets.Type.systemBars()的控制范围仅包含系统状态栏、导航栏两类系统级组件,ActionBar属于应用视图体系内的控件,不属于系统Bar的管控范围,所以调用隐藏系统栏的方法不会对ActionBar生效。
你之前用旧版SystemUiVisibility可以隐藏ActionBar,是因为SYSTEM_UI_FLAG_FULLSCREEN标记自带了隐藏Activity自带ActionBar的联动逻辑,新版Window Insets API没有内置该联动逻辑,需要单独处理。

解决方案

1. 隐藏ActionBar

根据你的使用场景二选一即可:

  • 仅当前Fragment需要全屏:在Fragment的onViewCreated生命周期中动态隐藏
    // 若使用AppCompat库的SupportActionBar
    (requireActivity() as AppCompatActivity).supportActionBar?.hide()
    // 若使用原生系统ActionBar
    // requireActivity().actionBar?.hide()
    
  • 整个Activity都不需要ActionBar:直接给Activity配置无ActionBar的主题,例:
    <activity
        android:name=".YourActivity"
        android:theme="@style/Theme.MaterialComponents.Light.NoActionBar" />
    

2. 完善Window Insets逻辑

确保代码在View附着到Window之后调用,避免insetsController为空不生效,完整可用代码如下:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    // 隐藏ActionBar
    (requireActivity() as AppCompatActivity).supportActionBar?.hide()
    
    requireActivity().window.apply {
        setDecorFitsSystemWindows(false)
        insetsController?.apply {
            hide(WindowInsets.Type.systemBars())
            systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        }
    }
}

// 页面退出时恢复原有状态,避免影响其他页面
override fun onDestroyView() {
    super.onDestroyView()
    (requireActivity() as AppCompatActivity).supportActionBar?.show()
    requireActivity().window.insetsController?.show(WindowInsets.Type.systemBars())
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:54:02