2

我有三个片段。我想在一个片段上应用透明状态栏。为此,我setOnItemSelectedListener在底部导航栏的方法上调用了下面的 hide 方法。还添加了我现在得到的图像

private fun hideStatusBar() {
    window.statusBarColor = ContextCompat.getColor(this@SuperActivity, R.color.transparent)
    WindowCompat.setDecorFitsSystemWindows(window, false)
    ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets ->
      val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars())

      view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
        leftMargin = insets.left
        rightMargin = insets.right
        bottomMargin = insets.bottom
      }
      WindowInsetsCompat.CONSUMED
    }
  }
    

  private fun showStatusBar() {
    window.statusBarColor = ContextCompat.getColor(this@SuperActivity, R.color.transparent)
    WindowCompat.setDecorFitsSystemWindows(window, true)
  }

我在片段调用隐藏方法时得到了适当的行为。 在此处输入图像描述

但是当我点击另一个片段(需要显示状态栏的片段)时,我得到以下行为:

在此处输入图像描述

4

1 回答 1

1

下边距默认为 0(或根布局“ binding.root”中的指定值)

因此,您需要再次重置下边距;如果它已经是0;那么你也能:

private fun showStatusBar() {
    window.statusBarColor = ContextCompat.getColor(this@SuperActivity, R.color.transparent)
    WindowCompat.setDecorFitsSystemWindows(window, true)

    ViewCompat.setOnApplyWindowInsetsListener(binding.root) { view, windowInsets ->
      val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars())

      view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
        bottomMargin = 0 // reset the margin
      }
      WindowInsetsCompat.CONSUMED
    }
  }
}

或者如果是别的东西;那么您需要将其从 dp 转换为像素并将其设置为bottomMargin

如果您在 binding.root 中有一些指定的边距值,则同样适用;但我认为你没有,因为问题只出现在底部。

更新:

在 showStatusBar 方法中不调用 setOnApplyWindowInsetsListener 方法。因为在这种情况下,Window Insets 没有改变。因为,我们在 hideStatusBar 方法中添加了边距,所以您在导航栏下方看到的这个空间来自 hideStatusBar 方法。

虽然应该触发监听器,但是可以直接更新根目录:

binding.root.updateLayoutParams<ViewGroup.MarginLayoutParams> {
    bottomMargin = 0
}

但请注意,setDecorFitsSystemWindows更新可能需要一些时间,因此updateLayoutParams不会产生效果,因此,您可能需要一点延迟:

Handler(Looper.getMainLooper()).postDelayed( {
    binding.root.updateLayoutParams<ViewGroup.MarginLayoutParams> {
        bottomMargin = 0
    }
 }, 0.1.toLong())
于 2021-11-11T04:55:45.013 回答