有没有办法检查状态栏的可见性?

Posted

技术标签:

【中文标题】有没有办法检查状态栏的可见性?【英文标题】:Is there a way to check the visibility of the status bar? 【发布时间】:2012-01-02 07:18:02 【问题描述】:

我有一项服务应该定期检查状态栏的可见性,当某些***活动处于(或不)处于全屏模式时。 有可能吗?

【问题讨论】:

【参考方案1】:

最后我发现了如何检查状态栏是否可见。它是某种黑客,但它对我有用。我在我的服务中创建了该方法:

private void createHelperWnd() 
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        final WindowManager.LayoutParams p = new WindowManager.LayoutParams();
        p.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
        p.gravity = Gravity.RIGHT | Gravity.TOP;
        p.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        p.width = 1;
        p.height = LayoutParams.MATCH_PARENT;
        p.format = PixelFormat.TRANSPARENT;
        helperWnd = new View(this); //View helperWnd;

        wm.addView(helperWnd, p);
        final ViewTreeObserver vto = helperWnd.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() 

            @Override
            public void onGlobalLayout() 

                if (heightS == helperWnd.getHeight()) 
                    isFullScreen = true;
                 else 
                    isFullScreen = false;
                
            
        );

    

其中 widthS 和 heightS 是我们的全局屏幕尺寸; 在这里,我只是将不可见的帮助窗口高度与屏幕高度进行了比较,并决定状态栏是否可见。并且不要忘记在您的 Service 的 onDestroy 中删除 helperWnd。

【讨论】:

我自己想出了一个与您类似的方法,除了覆盖 onSizeChanged... 在我的测试中,我发现我们的方法不适用于所有设备。它适用于所有 API10+ AVD 和 Moto Atrix2,但不适用于 Kindle Fire API10 和 SGS2 API15。在这些设备上,当另一个应用程序全屏时,覆盖不会自动调整大小,也不能在没有 FLAG_LAYOUT_IN_SCREEN 的情况下在状态栏上绘制覆盖。您是否遇到过这种情况和/或找到了更好/替代的解决方案? TIA! @deviant,您如何在平板电脑上获得“heightS”?请给出此代码【参考方案2】:

你好,如果你试试这个提供 android 作为良好实践的代码

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.
        
    
);

我留下文档的链接:https://developer.android.com/training/system-ui/visibility#java

【讨论】:

【参考方案3】:
public boolean isStatusBarVisible() 
    Rect rectangle = new Rect();
    Window window = getActivity().getWindow();
    window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
    int statusBarHeight = rectangle.top;
    return statusBarHeight != 0;

【讨论】:

【参考方案4】:

不是真的。如果它是 您的 活动在前台,您的活动可以告诉服务它是否正在使用隐藏状态栏的主题。但是,您无法独立于服务来确定这一点,更不用说第三方活动而不是您自己的活动了。

【讨论】:

我发现了 getSystemUiVisibility() 方法。文档说这是我需要的。但似乎它不起作用。返回结果总是 0 :( SystemUI 监听器工作得很好,但它们只会在 Honeycomb 及更高版本上告诉您软件按钮何时隐藏(在 Honeycomb 中这永远不会)。 @deviant 在我对 getSystemUiVisibility 的实验中,如果应用程序已全屏显示,它不会报告 SystemUI 可见性,只有当另一个应用程序使用了 API11+ 中可用的 setSystemUiVisibility 标志时(尽管仍在试验)。你有其他发现吗?

以上是关于有没有办法检查状态栏的可见性?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取状态栏和软键按钮栏的高度?

更改状态栏色调颜色

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

UIStatusBar样式与UINavigationBar一致

UI状态栏淡入淡出时间iOS

MacOSX 上 Qt 5.1 中状态栏的尺寸握把消失了