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

