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()) 检测状态栏可见性。