我一直在尝试调试在全屏活动中错误地应用填充的问题。该应用程序有一个真正全屏的片段,内容位于系统窗口后面,而另一个片段没有并且应该使用插图向内填充内容。当我尝试在一个简单的 repo 中重新创建时,我注意到当我从一个片段导航到另一个片段时,顶部插图似乎不包括工具栏的高度,而隐藏和显示工具栏。
我有一个相对简单的设置:一个带有两个片段的活动,使用 NavGraph 设置起始目的地以及在片段一和片段二之间导航,活动持有FragmentContainerView
. 在 FragmentOne 中,我还有三个按钮:一个用于隐藏系统栏,一个用于显示它们,第三个用于导航到另一个片段。
我会尽量保持代码简洁,所以我故意不包括所有内容。主题包括<item name="android:windowActionBarOverlay">true</item>
and<item name="windowActionBarOverlay">true</item>
它 extends Theme.MaterialComponents.DayNight.DarkActionBar
,所以它有一个工具栏。请参阅下面的代码代码中描述的日志记录结果。
活动
override fun onCreate(savedInstanceState: Bundle?) {
// Code to inflate the activity, setup navController, etc
WindowCompat.setDecorFitsSystemWindows(window, false)
ViewCompat.setOnApplyWindowInsetsListener(window.decorView.rootView) { view, insets ->
Log.d(
"INSETS",
"DecorRootView Insets: ${WindowInsetsCompat.toWindowInsetsCompat(insets).getInsets(WindowInsetsCompat.Type.systemBars()).toString()}"
)
val newInsets = v.onApplyWindowInsets(insets.toWindowInsets())
ViewCompat.dispatchApplyWindowInsets(binding.fragmentContainerView, WindowInsetsCompat.toWindowInsetsCompat(newInsets))
}
ViewCompat.setOnApplyWindowInsetsListener(binding.fragmentContainerView) { _, insets ->
Log.d(
"INSETS",
"FragmentContainerView Insets ${insets.getInsets(WindowInsetsCompat.Type.systemBars()).toString()}"
)
}
}
片段一
// Code to inflate the fragment in onCreateView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.hide.setOnClickListener {
WindowInsetsControllerCompat(activity.window, activity.window.decorView.rootView).hide(WindowInsetsCompat.Type.systemBars())
}
binding.show.setOnClickListener {
WindowInsetsControllerCompat(activity.window, activity.window.decorView.rootView).show(WindowInsetsCompat.Type.systemBars())
}
binding.navigate.setOnClickListener {
// navigate to FragmentTwo
}
ViewCompat.setOnApplyWindowInsetsListener(view) { v, insets ->
Log.d(
"INSETS",
"Fragment Insets: ${insets.getInsets(WindowInsetsCompat.Type.systemBars()).toString()}"
)
}
}
结果(请注意,我描述的是上面命名的每个“日志”,因此是 DecorRootView Insets、FragmentContainerView Insets 和 Fragment Insets)
- 单击隐藏按钮:所有 3 都将插入显示为 0
- 点击显示按钮:FragmentContainerView Insets 和 Fragment Insets 显示顶部 inset 为 220,而 DecorRootView Insets 显示为 66
- 导航到 FragmentTwo:DecorRootView Insets 和 FragmentContainerView Insets 都将顶部 inset 显示为 66
为什么在结果 #2 中包含工具栏高度?