检测状态栏可见性/ TYPE_SYSTEM_OVERLAY不自动调整大小

时间:2012-11-29 17:52:28

标签: android layout params

我正在使用众所周知的TYPE_SYSTEM_OVERLAY方法创建一个始终位于其他视图之上的全屏叠加层。

Moto Atrix2 API15以及AVDAPI 10的每个17上,当状态栏被其他应用隐藏时,叠加视图会自动调整大小(垂直展开)。正如我认为的那样,叠加层似乎“保持在所有其他视图的顶部”。当状态栏再次处于视图中时,叠加层会再次自动缩小其大小(较少的垂直像素,基本上减去状态栏的高度)。

这是期望的行为,我倾向于认为这不是例外或有缺陷的行为,因为它在许多不同的模拟器以及至少一个设备制造商( motorola )上工作,或许更多,但我无法访问addtl devices.

问题:Samsung GS2 (API15)&还在Kindle Fire (API10?)上进行了测试,当状态栏被另一个应用程序(全屏应用程序后面的状态栏)隐藏时,叠加层不会自动调整大小(填充状态栏曾经的空间)。在这些设备上,在创建视图后,我第一次从视图的onSizeChanged覆盖中不再获取任何事件。

以下是相关代码:

params = new WindowManager.LayoutParams( 
    1, WindowManager.LayoutParams.MATCH_PARENT, 
    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 
    PixelFormat.TRANSPARENT);
wm.addView(sizeLayout, params);

sizeLayout具有onSizeChanged覆盖。

我几乎可以找到我可以找到的windowmanager layoutparam,包括SYSTEM_ALERT,FLAG_LAYOUT_IN_SCREEN等等。在我弄清楚之前我不会睡觉!

编辑11/30/12 :我从@deviant发现了这个:https://stackoverflow.com/a/9195733/1851478这基本上就是我正在做的事情,但问题仍然是某些设备没有自动调整system_overlay的大小。也许我应该提出一个错误。

更多信息:如果我强制重绘(或者甚至只是加载叠加层应用),而视图树顶部有一个全屏应用,我的叠加层仍然不会覆盖状态栏通常占用的空间(即使在绘制时状态栏不在视图中),所以看起来好像叠加层没有“覆盖”在最前面的全屏幕窗口的顶部(我已经创建并测试了很多全部屏幕应用程序使用各种方法使它们全屏显示)。在这些设备上,使覆盖层绘制状态栏的唯一方法是(即使状态栏不在视图中)是使用标记FLAG_LAYOUT_IN_SCREEN,但布局的大小永远不会改变,是总是全屏,因此回到原来的问题,为什么这适用于某些设备而不是其他设备。

编辑12/12/12 :所以我对此没有任何进一步的运气,我确实尝试在视图上使用getLocalVisibleRect,但不幸的是,因为我的应用程序不拥有SystemUI视图,它无法检测叠加层下面的内容。我想用自定义ROM我可以做到这一点,但我需要一个没有root的解决方案。

我确实看到市场上的其他应用在检测上面列出的非工作手机上的状态栏时遇到了同样的问题。示例:酷工具,欧米茄状态栏&状态栏+。赏金提高了。

编辑12/19/12 已添加图片。请注意,在工作设备上,灰色区域也“覆盖”黑色区域(任何当前全屏应用),黑色区域实际上覆盖整个屏幕,我只是将灰色区域显示为我的叠加,即使它也是全屏(减去或加上状态栏的高度,具体取决于工作/非工作设备以及是否在视图中)。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:3)

希望我明白你在这之后的情况但是,在我的应用程序(TEAM BatteryBar)中我遇到了类似的问题。 (没有root最小权限)

我无法在API11以下的任何地方检测到全屏(并且在API11之上的某些(主要是三星)设备上断断续续)。所以我通过向WindowManager添加第二个布局并使用不同的布局参数创建了一个自定义侦听器,然后覆盖onLayout以通过检查窗口大小来检查statusBar是否仍然存在。从那里你可以做你需要的主视图。

我打算整理它,但它确实有效,所以我没有:P代码已经超过一年了,是从我第一次开始编写android的时候,是的。思考的食物。希望它有所帮助。

here is the code in a repo at my github直接从我的应用中复制粘贴我如何使用它。这里的小片段

wm.addView(sizeLayout, params);// add your view

// then add the next one
Screendetect mDetector;
mDetector = new Screendetect(this);
mDetector.setOnFullScreenListener(new OnFullScreenListener() {
            @Override
            public void fsChanged(boolean FS_Bool) {
                // TODO rethink this to be better.... bit hacky...
                if (FS_Bool) {
                    Log.d("battbardetect", "Statusbar hidden");
                    FS_vissible(); // do what ever you need to
                } else if (!FS_Bool) {
                    Log.d("battbardetect", "Statusbar Vissible"); 
                    FS_hidden(); // do what ever you need to
                }
            }
        });
wm.addView(mDetector, params);

答案 1 :(得分:1)

我认为这可能是将标题栏隐藏在对话框窗口上的问题,系统会将可见性设置为隐藏而不是消失。这会导致对话框窗口错误居中。

为此,我就是这样解决的。这可能适用于您的情况,但您可能需要根据状态栏标识符的名称对其进行调整。

Window window = dialog.getWindow();
View view = window.getDecorView();
int topPanelId = getResources().getIdentifier("topPanel", "id", "android");
LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId);
topPanel.setVisibility(View.GONE);
相关问题