在全屏模式下收听状态栏/导航栏可见性?

Posted

技术标签:

【中文标题】在全屏模式下收听状态栏/导航栏可见性?【英文标题】:Listen to statusbar/navbar visibility in fullscreen mode? 【发布时间】:2021-10-30 17:33:49 【问题描述】:

在我的活动中,我使用以下代码全屏隐藏状态栏和导航栏:

window.apply 
    decorView.systemUiVisibility = (
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_FULLSCREEN
                    or View.SYSTEM_UI_FLAG_IMMERSIVE
            )
    addFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN
                or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
    )

android 使状态栏和导航栏仍然可以临时出现在屏幕底部或顶部滑动,我如何检测此事件何时发生? (这似乎是可能的,因为默认的操作栏会自动显示/隐藏状态栏)

【问题讨论】:

您好 Bencri,您找到解决方案了吗? @K.tas 不... 我在下面找到并回答了。它帮助了我,希望它也能帮助你。 【参考方案1】:

经过一番搜索,我找到了适用于已弃用 API 和新 API 的解决方案。

你可以用这个;

private void setSystemUiVisibilityListener() 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) 
        //Use this for Devices which has SDK Version greater then R
        yourViewToListen.setOnApplyWindowInsetsListener((v, insets) -> 
            WindowInsets suppliedInsets = v.onApplyWindowInsets(insets);
            //Listen for only status bar and navigation bar
            if (suppliedInsets.isVisible(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars())) 
                //Do whatever you want when system status bar OR navigation bars are visible
            
            return suppliedInsets;
        );
     else  //And use this for older SDK versions (It is deprecated on new SDKs)
        yourViewToListen.setOnSystemUiVisibilityChangeListener(visibilityChangeListeners -> 
            if ((visibilityChangeListeners & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) 
                //Do whatever you want when system status bar OR navigation bars are visible
            
        );
    

【讨论】:

您想要实现的是检测用户何时进入或退出全屏模式,对吧?我想要做的是当全屏模式被激活时,检测用户是否通过在屏幕顶部滑动来临时显示系统栏。 不,在全屏模式下,如果用户从上角向下滑动,则系统状态栏和导航栏将可见。您可以使用上面的代码 sn-p 检测到这一点。这就是我想要实现的。所以这就是你想要的。那么请将此问题标记为已回答。 你用什么进入全屏模式?这对我不起作用,所以我试图了解原因。 这个问题不是关于进入全屏模式的。我假设您可以按照问题中的说明进入全屏模式。如果您在进入全屏时遇到问题,请更新您的问题。不过不管怎样,我用和你一样的方法进入全屏模式。 正如我所说,这对我不起作用,所以在我找出原因之前不会回答这个问题。这就是为什么我问你是否使用了我在第一条消息中写的完全相同的论点。【参考方案2】:

点击此链接:Full-Screen Mode.

// This snippet hides the system bars.
private void hideSystemUI() 
    // Set the IMMERSIVE flag.
    // Set the content to appear under the system bars so that the content
    // doesn't resize when the system bars hide and show.
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar
            | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar
            | View.SYSTEM_UI_FLAG_IMMERSIVE);


// This snippet shows the system bars. It does this by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() 
    mDecorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

【讨论】:

这不能回答我的问题。我知道如何进入沉浸式模式。我不知道之后如何收听系统 ui 可见性(当用户点击/拖动屏幕边框时,它仍会显示几秒钟)

以上是关于在全屏模式下收听状态栏/导航栏可见性?的主要内容,如果未能解决你的问题,请参考以下文章

iOS MapView 位于导航栏、状态栏和标签栏控制器下

在全屏模式下显示状态栏 Ionic for android 和 iOS

如何在更改全屏/上方导航时使用导航组件 navhostfragment

在全屏模式演示样式中使用 segue 时如何仍然显示导航栏?

Apple Watch:从基于页面的导航显示模式屏幕后,状态栏不可见

导航栏不可见