Detect Status Bar Visibility / TYPE_SYSTEM_OVERLAY not resizing automatically
我正在使用众所周知的 TYPE_SYSTEM_OVERLAY 方法创建一个始终位于其他视图之上的全屏覆盖。
在 Moto Atrix2 API15 上和从 API 10 到 17 的每个 AVD 上,当状态栏被另一个应用程序隐藏时,覆盖视图会自动调整大小(垂直扩展)。正如我认为的那样,叠加层似乎"保持在所有其他视图的顶部"。当状态栏再次出现时,叠加层会再次自动缩小其大小(垂直像素减少,基本上减去状态栏的高度)。
这是期望的行为,并且我倾向于认为这不是例外或有缺陷的行为,因为它适用于许多不同的模拟器以及至少一个设备制造商(摩托罗拉),也许更多,但我没有访问 addtl devices.
问题:在 Samsung GS2 (API15)
- 您能否添加所需行为的屏幕截图以及您得到的内容?
-
你试过全屏吗?在添加视图之前尝试://全屏 WindowManager.LayoutParams attrs = mActivity.getWindow().getAttributes(); attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; mActivity.getWindow().setAttributes(attrs);
-
@Anis,是的,我尝试过 full_screen 标志并获得相同的行为。但是,您的问题可能表明您没有完全掌握问题,建议您再阅读一遍。不过谢谢你的主意! :)
希望我能理解您在这里的目的,但是在我的应用程序(TEAM BatteryBar)中,我遇到了类似的问题。 (没有root最低权限)
我无法在 API11 以下的任何设备上检测到全屏(并且在 API11 以上的某些(主要是三星)设备上是间歇性的)。因此,我通过使用不同的布局参数向 WindowManager 添加第二个布局,然后通过检查窗口大小覆盖 onLayout 以检查 statusBar 是否仍然存在,从而为其创建了一个自定义侦听器。从那里你可以对你的主视图做任何你需要做的事情。
我打算整理它,但它起作用了,所以我没有:P 代码已经有一年多了,而且是从我第一次开始为 android 编码时开始的,所以是的。值得深思。希望有帮助。
这里是我的 github 上的一个 repo 中的代码,直接从我的应用程序中复制粘贴,说明我是如何使用它的。这里的小片段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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); |
-
我会尝试 OnFullScreenListener,但基本上你的答案只是重新措辞/做我已经尝试过的同样的事情,而且我记录的内容不适用于所有设备。它适用于某些人,但不适用于其他人(似乎没有解释)。在非工作设备上,无论是使用 OnFullScreenListener、OnGlobalLayoutListener 还是在覆盖布局上覆盖 onSizeChanged,您的方法(以及我的/偏差)似乎都不会自动检测覆盖调整大小。
-
我查看了您的代码,您只是覆盖了 onLayout,我已经在非工作设备上尝试过但没有成功。在我的示例/问题中,我覆盖了 onSizeChanged 并尝试覆盖我可以在膨胀的覆盖布局中几乎所有的视图方法(几乎和你所做的一样)。
-
好的,谢谢你的尝试。我尝试了您的代码,几乎是逐字逐句和同样的问题,onLayout 仅在首次添加视图(或更改配置)时调用一次,直到服务(或视图)被销毁/删除和创建/添加后才再次调用再次。即使我反复添加和删除视图,除非我在屏幕标志中添加布局,否则垂直大小永远不会改变。所以基本相同的问题,至少在三星 GS2 API15 上测试过。 BTW onSystemUiVisibilityChange 也不起作用。我没有从中得到任何事件:GS2 设备是带有物理导航键的 ICS。
-
哦,顺便说一句,我在三星 GS2 上尝试了你的电池条应用程序,你的应用程序有同样的问题,它无法检测到全屏应用程序(如果你在那里发布的话,我猜你的 Kindle Fire 也会有同样的问题)。
-
有趣的是,是某些/选择的几个全屏应用程序还是全部? (我注意到我忘记在免费版本上添加遗留检测选项,我今晚要更新)编辑三星固件中可能存在的错误?因为我的 Sony API15 两者都可以使用。
-
是的,任何全屏应用程序(甚至我自己写了几个来尝试设置全屏的不同方法,不管如何,也不管哪个例子 youtube/etc.)。是的,我认为三星 FW 中可能存在错误,但它也发生在 Kindle Fire 上,所以它开始让我想知道......
-
好的,我的一个朋友有一个 S2 我会让他过来玩。 kindle fire 运行经过修改的 API10(GB) 或 API15(ICS)(我认为),因此该错误可能来自 AOSP 树。
我认为这可能与在系统将可见性设置为隐藏而不是消失的对话框窗口上隐藏标题栏相同的问题。这会导致对话框窗口不正确地居中。
为此,这就是我的解决方法。这可能适用于您的情况,但您可能需要根据状态栏标识符的名称对其进行调整。
1 2 3 4 5
| 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); |
- 我相当确定这将需要 root(可能还有自定义 SystemUI.apk),我需要一个没有这些的解决方案。其次,我对隐藏状态栏并不感兴趣,只是检测它是否可见。我会玩这个一些,但我不抱希望。
-
我没有成功设置我的应用程序不拥有的视图的可见性...感谢您的尝试。