我在 Android 11 中面临全屏沉浸式模式的问题。我的主要活动布局文件看起来像这样,
<DrawerLayout .... android:fitsSystemWindows="true">
<CoordinatorLayout>
<AppBarLayout>
<FragmentContainerView>
我正在尝试从我的片段中显示全屏模式。在 Android 11 之前,我曾经从 Fragment 的 onCreate 视图调用以下函数
fun hideStatusBar (activity: AppCompatActivity?) {
activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) }
我将其替换为,
fun hideStatusBar(activity: AppCompatActivity?) {
@Suppress("DEPRECATION")
if (isAtLeastAndroid11()) {
val controller = activity?.window?.insetsController
controller?.hide(WindowInsets.Type.statusBars())
} else {
activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
}
}
这会按预期删除状态栏,但会在状态栏区域的屏幕顶部留下一个空白区域
带状态栏:
状态栏已移除:
我试图测量片段内的窗口插图并调整片段容器的高度
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
if(isAtLeastAndroid11()){
WindowCompat.setDecorFitsSystemWindows(requireActivity().window, false)
setUiWindowInsets()
}
}
private fun setUiWindowInsets() {
ViewCompat.setOnApplyWindowInsetsListener(rootView) { _, insets ->
posTop = insets.getInsets(WindowInsetsCompat.Type.systemBars()).top
posBottom = insets.getInsets(WindowInsetsCompat.Type.systemBars()).bottom
rootView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
updateMargins(
top = posTop,
bottom = posBottom)
}
insets
}
}
但是我的 ViewCompat.setOnApplyWindowInsetsListener 永远不会被调用。根据本文,Coordinator Layout 使用 onApplyWindowInsets 回调,并且子级不会收到任何回调。rootView
是我的 Fragment 的根视图(一个相对布局),它被放置在我的布局层次结构中的 FragmentContainer 中。
Android 10 和 11 之间的比较
我的问题:
- 我应该如何
setOnApplyWindowInsetsListener
在片段中调用我的方法? - 当状态栏隐藏时,我应该如何让我的协调器布局知道占据全屏?
参考:协调器布局消耗回调: