检测状态栏可见性/ TYPE_SYSTEM_OVERLAY不会自动resize

我使用众所周知的TYPE_SYSTEM_OVERLAY方法来创build一个总是在其他视图之上的全屏叠加。

Moto Atrix2 API15API 1017的每个AVD ,当状态栏被另一个应用程序隐藏时,叠加视图会自动resize(垂直扩展)。 我认为,叠加层似乎“保持在所有其他视图的顶部”。 当状态栏再次出现时,叠加层再次自动缩小其大小(垂直像素减less,基本上减去状态栏的高度)。

这是所需的行为,我倾向于认为这不是例外或有缺陷的行为,因为它在许多不同的仿真器以及至less一个设备制造商( 摩托罗拉 ),也许更多,但我没有访问addtl devices.

问题:Samsung GS2 (API15)也testing过Kindle Fire (API10?) ,当状态栏被另一个应用程序隐藏时,覆盖图不会自动resize(填满状态栏的空间)全屏幕的应用程序)。 在这些设备上,第一次创build视图后,我没有从视图的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覆盖。

我已经玩过了我能find的所有layoutparam ,包括SYSTEM_ALERT,FLAG_LAYOUT_IN_SCREEN等。我不会睡觉,直到我能弄清楚为止!

编辑11/30/12 :我发现这从@deviant: https ://stackoverflow.com/a/9195733/1851478这基本上是我在做什么,但是问题仍然存在于某些设备不自动调整system_overlay。 也许我应该提出一个错误。

更多信息:如果我强制重绘(甚至只是加载覆盖应用程序),而在视图树顶部有一个全屏幕的应用程序,我的覆盖仍然不会绘制状态栏通常占用的空间(即使在绘制的时候状态栏是不可见的),所以看起来好像叠加层并不是在全屏幕的最前面的窗口之上“叠加”(我已经创build并testing了许多全屏应用程序各种各样的方法,使他们全屏幕)。 在这些设备上,只有使用标志FLAG_LAYOUT_IN_SCREEN才能使覆盖图绘制状态栏(即使状态栏不在视图中),但布局的大小始终不变,始终为全屏,从而回到原来的问题,为什么这在一些设备上,而不是其他人。

编辑12年12月12日 :所以我没有任何进一步的运气,对此,我曾尝试使用getLocalVisibleRect的意见,但不幸的是,因为我的应用程序不拥有SystemUI的意见,它不能检测到下面的重叠。 我想用自定义ROM我可以做到这一点,但我需要一个没有根的解决scheme。

我确实看到市场上的其他应用程序在检测上面列出的非工作电话上的状态栏时遇到同样的问题。 例如:酷工具,欧米茄状态栏和状态栏+。 赏金提出。

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

在这里输入图像说明在这里输入图像说明

希望我明白你在这里之后,但在我的应用程序(TEAM BatteryBar)我有一个类似的问题。 (没有root权限)

我无法在API11以下的任何东西上检测到全屏(在API11上的某些(主要是三星)设备上是间歇性的)。 所以我做了一个自定义监听器,通过向WindowManager添加另一个布局参数,然后通过检查窗口大小,覆盖onLayout来检查statusBar是否仍然存在。 从那里你可以做任何你需要的东西到你的主视图。

我打算整理它,但它的工作,所以我没有:P代码已经超过了一年,是从我第一次开始编码为Android的时候是这样的。 食物思想寿。 希望能帮助到你。

这里是在我的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); 

我认为这可能是相同的问题隐藏标题栏的对话窗口系统设置隐藏而不是消失的可见性。 这会导致对话窗口不正确居中。

为此,这是我如何解决它。 这可能适用于您的情况,但您可能需要调整状态栏标识符的名称。

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