如何检测系统导航栏在全屏模式下出现?

3
以下代码可以成功隐藏系统导航栏从屏幕上消失。用户仍然可以向上滑动以显示导航栏,导航栏会保持在屏幕上几秒钟,然后再次消失。
是否有回调函数来检测导航栏何时出现和消失,当用户向上滑动后,导航栏自动隐藏后?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {

    getWindow().setDecorFitsSystemWindows(false);

    if (getWindow().getInsetsController() != null) {
        getWindow().getInsetsController().hide(WindowInsets.Type.navigationBars());
        getWindow().getInsetsController().setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
    }

} else {

    getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
    );
}

下面的代码(摘自文档)似乎可以检测导航栏在启动时是否隐藏,但不能检测用户向上滑动以显示它或之后它消失的情况。
View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener
        (new View.OnSystemUiVisibilityChangeListener() {
    @Override
    public void onSystemUiVisibilityChange(int visibility) {
        // Note that system bars will only be "visible" if none of the
        // LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
        if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
            // TODO: The system bars are visible. Make any desired
            // adjustments to your UI, such as showing the action bar or
            // other navigational controls.
        } else {
            // TODO: The system bars are NOT visible. Make any desired
            // adjustments to your UI, such as hiding the action bar or
            // other navigational controls.
        }
    }
});
1个回答

2
有没有回调函数可以检测到导航栏的出现和消失,例如当用户向上滑动时,以及导航栏自动隐藏后?
很遗憾,你无法检测到这一点,因为用户滑动以显示导航栏或状态栏不是你的应用的一部分,而是系统在运行不同进程中的责任。
实际上,用户的滑动并不影响你的应用窗口;因此,栏放置在你的活动之上(不带任何额外的插入),这证明它与系统窗口相关。所以,在你的应用程序进程/窗口中的任何监听器都无法解决这个问题。
详情请查看此答案

这个回答似乎与Android文档相矛盾,文档中明确表示可以检测系统栏的出现和消失。文档中写道:“例如,您可以使用此监听器来与状态栏的隐藏和显示一起隐藏和显示操作栏。”我完全可以相信文档可能已经过时了。你有什么来源可以支持你的说法吗?https://developer.android.com/training/system-ui/visibility#listener - undefined
@LukeNeedham 当应用程序全屏时,当您尝试从底部向上滑动显示导航栏时,此侦听器的回调不会触发。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接