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

log*_*ray 37 layout android params

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

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

这是期望的行为,我倾向于认为这不是例外或有缺陷的行为,因为它在许多不同的模拟器以及至少一个设备制造商(摩托罗拉)上工作,可能更多,但我无法访问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);
Run Code Online (Sandbox Code Playgroud)

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图片添加.请注意,在工作设备上,灰色区域也"覆盖"黑色区域(任何当前全屏应用),黑色区域实际上覆盖整个屏幕,我只是将灰色区域显示为我的叠加,即使它也是全屏(减去或加上状态栏的高度,具体取决于工作/非工作设备以及是否在视图中).

在此输入图像描述 在此输入图像描述

Chu*_*k D 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);
Run Code Online (Sandbox Code Playgroud)