我正在使用众所周知的 TYPE_SYSTEM_OVERLAY
方法创建一个全屏叠加层,始终位于其他视图之上。
在 Moto Atrix2 API15
上,对于每个从 API 10
到 17
的 AVD
,当状态栏被其他应用程序隐藏时,叠加视图会自动调整大小(在垂直方向上扩展)。我认为这个叠加层应该“始终位于其他视图之上”。当状态栏再次出现时,叠加层会自动缩小其大小(基本上是减去状态栏的高度)。
这是期望的行为,我倾向于认为这不是异常或有缺陷的行为,因为它在许多不同的模拟器上以及至少一个设备制造商(motorola)上都可以工作,可能还有更多,但我无法获得访问权限来测试 addtl devices
。
问题:在 Samsung GS2 (API15)
上(也在 Kindle Fire (API10?)
上测试),当状态栏被其他应用程序隐藏时(全屏应用程序的状态栏在后面),叠加层不会自动调整大小(填充状态栏曾经所在的空间)。在这些设备上,视图创建后第一次之后,我没有再收到关于视图大小更改的任何事件。
以下是相关代码:
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://dev59.com/EWsy5IYBdhLWcg3w9Szk#9195733,基本上就是我正在做的事情,但某些设备仍然无法自动调整system_overlay的大小。也许我应该提出一个错误报告。
更多信息:如果我在视图树的顶部有一个全屏应用程序时,强制重绘(甚至只是加载叠加层应用程序),我的叠加层仍然不会绘制在状态栏通常占据的空间上(即使状态栏在绘制时不可见),因此似乎叠加层没有"叠加"在最前面的全屏窗口之上(我创建并测试了许多全屏应用程序,使用各种方法使它们全屏)。在这些设备上,使叠加层绘制在状态栏上(即使状态栏不可见)的唯一方法是使用flag FLAG_LAYOUT_IN_SCREEN
,但这样布局的大小永远不会改变,总是全屏,因此回到最初的问题:为什么这在某些设备上有效但在其他设备上无效。
编辑12/12/12:所以我在这方面没有进一步的运气,我确实尝试过在视图上使用 getLocalVisibleRect,但不幸的是,由于我的应用程序不拥有SystemUI视图,它无法检测叠加层下面的内容。我想,如果有一个定制的ROM,我可以做到这一点,但我需要一个没有root权限的解决方案。
我看到市场上的其他应用程序也遇到了在我上面列出的不起作用的手机上检测状态栏的同样的问题。例如:Cool Tool、Omega Statusbar和Status Bar+。赏金已经提高。
编辑12/19/12 添加图片。请注意,在工作正常的设备上,灰色区域也“覆盖”黑色区域(任何当前全屏的应用程序),黑色区域实际上覆盖整个屏幕,我只是将灰色区域显示为我的叠加层,即使它也是全屏的(减去或加上状态栏的高度,具体取决于工作/不工作的设备以及它是否在视图中)。