关于 android:Detect Status Bar Visibility / TYPE_SYSTEM_OVERLAY 不自动调整大小

Detect Status Bar Visibility / TYPE_SYSTEM_OVERLAY not resizing automatically

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

Moto Atrix2 API15 上和从 API 1017 的每个 AVD 上,当状态栏被另一个应用程序隐藏时,覆盖视图会自动调整大小(垂直扩展)。正如我认为的那样,叠加层似乎"保持在所有其他视图的顶部"。当状态栏再次出现时,叠加层会再次自动缩小其大小(垂直像素减少,基本上减去状态栏的高度)。

这是期望的行为,并且我倾向于认为这不是例外或有缺陷的行为,因为它适用于许多不同的模拟器以及至少一个设备制造商(摩托罗拉),也许更多,但我没有访问 addtl devices.

问题:在 Samsung GS2 (API15)


希望我能理解您在这里的目的,但是在我的应用程序(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);


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

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

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