Android 检测状态栏可见性/类型\u系统\u覆盖未自动调整大小

Android 检测状态栏可见性/类型\u系统\u覆盖未自动调整大小,android,layout,params,Android,Layout,Params,我正在使用众所周知的TYPE\u SYSTEM\u OVERLAY方法创建一个始终位于其他视图顶部的全屏覆盖 在Moto Atrix2 API15上,对于从API 10到17的每个AVD,当另一个应用程序隐藏状态栏时,覆盖视图会自动调整大小(垂直展开)。覆盖层似乎“停留在顶部”的所有其他视图,因为我认为它应该。当状态栏再次显示时,叠加将再次自动减小其大小(减少垂直像素,基本上减去状态栏的高度) 这是理想的行为,我倾向于认为这不是例外或有缺陷的行为,因为它在许多不同的模拟器以及至少一个设备制造商(

我正在使用众所周知的
TYPE\u SYSTEM\u OVERLAY
方法创建一个始终位于其他视图顶部的全屏覆盖

Moto Atrix2 API15
上,对于从
API 10
17的每个
AVD
,当另一个应用程序隐藏状态栏时,覆盖视图会自动调整大小(垂直展开)。覆盖层似乎“停留在顶部”的所有其他视图,因为我认为它应该。当状态栏再次显示时,叠加将再次自动减小其大小(减少垂直像素,基本上减去状态栏的高度)

这是理想的行为,我倾向于认为这不是例外或有缺陷的行为,因为它在许多不同的模拟器以及至少一个设备制造商(摩托罗拉)上工作,也许更多,但我没有访问
addtl设备的权限。

问题:在三星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);
sizeLayout具有onSizeChanged覆盖

我已经玩弄了几乎所有我能找到的
windowmanager
layoutparam
,包括系统警报、屏幕中的标志布局等等。在我弄明白之前,我不会睡觉

编辑11/30/12:我从@deviant:中发现了这个问题,这基本上就是我正在做的,但是问题仍然存在于某些设备没有自动调整系统覆盖的大小。也许我应该提出一个错误

更多信息:如果我在视图树顶部有一个全屏应用程序的情况下强制重画(甚至只是加载覆盖应用程序),我的覆盖仍然不会覆盖状态栏通常占用的空间(即使绘制时状态栏不在视图中),因此似乎覆盖没有“覆盖”在最前面的全屏窗口上(我已经创建并测试了许多全屏应用程序,使用各种方法使它们全屏显示)。在这些设备上,获得覆盖以绘制状态栏(即使状态栏不在视图中)的唯一方法是在屏幕中使用标志
flag\u LAYOUT\u,但是布局的大小永远不会改变,始终是全屏,因此回到了最初的问题,为什么这在某些设备上有效,而在其他设备上无效

编辑12/12/12:因此我在这方面没有任何进一步的运气,我尝试在视图上使用getLocalVisibleRect,但不幸的是,由于我的应用程序不拥有SystemUI视图,因此无法检测覆盖层下的内容。我想用一个自定义ROM我可以做到这一点,但我需要一个没有根的解决方案

我确实看到市场上的其他应用程序在检测上面列出的非工作手机上的状态栏时也遇到了同样的问题。示例:酷工具、欧米茄状态栏和状态栏+。悬赏金提高了

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


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

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

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

希望我能理解你的意图,但在我的应用程序(TeamBatteryBar)中,我遇到了类似的问题。(无根权限)

我无法在API11以下的任何设备上检测到全屏显示(在API11以上的一些设备上(多数是三星)是间歇性的)。因此,我为它创建了一个自定义侦听器,通过使用不同的布局参数向WindowManager添加第二个布局,然后通过检查窗口大小覆盖onLayout以检查状态栏是否仍然存在。从那里,您可以对主视图执行任何需要的操作

我本来打算把它整理一下,但它成功了,所以我没有:p代码已经有一年多了,是我第一次开始为android编码时的代码。是的。值得思考。希望它能有所帮助

直接从我的应用程序中复制粘贴我是如何使用它的

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

您可以添加所需行为的屏幕截图以及所获得的内容吗?您是否尝试过转到全屏?在添加视图之前,请尝试://转到全屏WindowManager.LayoutParams attrs=mActivity.getWindow().getAttributes();attrs.flags |=WindowManager.LayoutParams.FLAG_FULLSCREEN;mActivity.getWindow().setAttributes(attrs);@Anis,是的,我尝试了全屏标志并获得了相同的行为。但是,您的问题表明您可能没有完全理解问题,我建议您重新阅读。不过,感谢您的想法!:)我相当确定这将需要root(以及自定义的SystemUI.apk),我需要一个没有这两者的解决方案。其次,我对隐藏状态栏并不感兴趣,只是检测它是否可见。我会玩一些,但我不抱希望。我没有成功设置我的应用程序不拥有的视图的可见性。。。谢谢你的努力。好的,谢谢你的努力。我试过你的代码,几乎是逐字逐句的,同样的问题,onLayout只在第一次添加视图时调用一次(或者在confi上)