0

我一直在尝试调试在全屏活动中错误地应用填充的问题。该应用程序有一个真正全屏的片段,内容位于系统窗口后面,而另一个片段没有并且应该使用插图向内填充内容。当我尝试在一个简单的 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)

  1. 单击隐藏按钮:所有 3 都将插入显示为 0
  2. 点击显示按钮:FragmentContainerView Insets 和 Fragment Insets 显示顶部 inset 为 220,而 DecorRootView Insets 显示为 66
  3. 导航到 FragmentTwo:DecorRootView Insets 和 FragmentContainerView Insets 都将顶部 inset 显示为 66

为什么在结果 #2 中包含工具栏高度?

4

0 回答 0