WindowInsetsControllerCompat.OnControllableInsetsChangedListener 不要在插图上触发显示动作
WindowInsetsControllerCompat.OnControllableInsetsChangedListener don't fire on insets show action
我有这个听众:
val listener = WindowInsetsControllerCompat.OnControllableInsetsChangedListener { controller: WindowInsetsControllerCompat, typeMask: Int ->
Log.i(FragmentVodPlayer.TAG, "onControllableInsetsChanged: changed")
if (typeMask and WindowInsetsCompat.Type.statusBars()
== WindowInsetsCompat.Type.statusBars()
|| typeMask and WindowInsetsCompat.Type.navigationBars()
== WindowInsetsCompat.Type.navigationBars()
) {
hideAfterAWhile.postDelayed({
controller.hide(
WindowInsetsCompat.Type.navigationBars()
or WindowInsetsCompat.Type.statusBars()
)
}, 3000)
}
}
然后我将它添加到 instetsController
,如下所示:
insetsController.addOnControllableInsetsChangedListener(listener)
当我执行时它工作正常:
insetsController.hide(
WindowInsetsCompat.Type.statusBars()
or WindowInsetsCompat.Type.navigationBars()
)
但是当我点击屏幕并显示导航栏时,此侦听器永远不会触发,根据我在文档中阅读的内容,它应该会触发。
我知道当我隐藏系统栏时这个侦听器可以工作,因为我可以看到它将消息打印到我的 logcat。
所以,经过很多很多尝试让这个工作我放弃了,但我发现如果你改变 systemBarsBehaviour
insetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
系统自己隐藏了所有内容,我更容易获得想要的效果,可能这就是它的意图。
我遇到了同样的问题,所以我最终使用 View.OnApplyWindowInsetsListener
并使用 WindowInsets.isVisible(WindowInsets.Type.statusBars())
检测状态栏可见性。
我有这个听众:
val listener = WindowInsetsControllerCompat.OnControllableInsetsChangedListener { controller: WindowInsetsControllerCompat, typeMask: Int ->
Log.i(FragmentVodPlayer.TAG, "onControllableInsetsChanged: changed")
if (typeMask and WindowInsetsCompat.Type.statusBars()
== WindowInsetsCompat.Type.statusBars()
|| typeMask and WindowInsetsCompat.Type.navigationBars()
== WindowInsetsCompat.Type.navigationBars()
) {
hideAfterAWhile.postDelayed({
controller.hide(
WindowInsetsCompat.Type.navigationBars()
or WindowInsetsCompat.Type.statusBars()
)
}, 3000)
}
}
然后我将它添加到 instetsController
,如下所示:
insetsController.addOnControllableInsetsChangedListener(listener)
当我执行时它工作正常:
insetsController.hide(
WindowInsetsCompat.Type.statusBars()
or WindowInsetsCompat.Type.navigationBars()
)
但是当我点击屏幕并显示导航栏时,此侦听器永远不会触发,根据我在文档中阅读的内容,它应该会触发。
我知道当我隐藏系统栏时这个侦听器可以工作,因为我可以看到它将消息打印到我的 logcat。
所以,经过很多很多尝试让这个工作我放弃了,但我发现如果你改变 systemBarsBehaviour
insetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
系统自己隐藏了所有内容,我更容易获得想要的效果,可能这就是它的意图。
我遇到了同样的问题,所以我最终使用 View.OnApplyWindowInsetsListener
并使用 WindowInsets.isVisible(WindowInsets.Type.statusBars())
检测状态栏可见性。