web-dev-qa-db-ja.com

ステータスバーの可視性の検出/ TYPE_SYSTEM_OVERLAYが自動的にサイズ変更されない

よく知られている_TYPE_SYSTEM_OVERLAY_メソッドを使用して、常に他のビューの上に表示されるフルスクリーンオーバーレイを作成しています。

_Moto Atrix2 API15_および_API 10_から_17_までの各AVDで、ステータスバーが別のアプリによって非表示になると、オーバーレイビューのサイズが自動的に変更されます(垂直方向に拡大されます)。オーバーレイは、他のすべてのビューよりも「上にとどまっている」ように見えます。ステータスバーが再び表示されると、オーバーレイは自動的にサイズを縮小します(垂直ピクセルが少なくなり、基本的にステータスバーの高さが差し引かれます)。

これは望ましい動作であり、多くの異なるエミュレーターと少なくとも1つのデバイスメーカー(Motorola)で動作するため、これは例外または欠陥のある動作ではないと考える傾向があります。おそらくそれ以上ですが、私は_addtl devices._にアクセスできません

問題:Samsung 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オーバーライドがあります。

SYSTEM_ALERT、FLAG_LAYOUT_IN_SCREENなど、見つけることができるほぼすべてのwindowmanagerlayoutparamをいじってみました。これを理解できるまで、私は眠りません!

編集11/30/12:@ deviantからこれを見つけました: https://stackoverflow.com/a/9195733/1851478 これは基本的に私が行っていることですが、system_overlayのサイズを自動的に変更しない特定のデバイスで問題が残ります。おそらく私はバグを提起する必要があります。

詳細情報:ビューツリーの上部にフルスクリーンアプリがあるときに再描画を強制する(またはオーバーレイアプリをロードする)と、ステータスバーが通常占めるスペースをオーバーレイが描画しません(描画時にステータスバーが表示されないため、フルスクリーンである最前面のウィンドウの上にオーバーレイが「オーバーレイ」されていないように見えます(そして、を使用して多くのフルスクリーンアプリを作成してテストしました全画面表示にするためのさまざまな方法)。これらのデバイスでは、(ステータスバーが表示されていない場合でも)オーバーレイでステータスバーを描画する唯一の方法は、フラグ_FLAG_LAYOUT_IN_SCREEN_を使用することですが、レイアウトのサイズは変更されません。常にフルスクリーンであるため、これが一部のデバイスでは機能するが他のデバイスでは機能しない理由を元の問題に戻します。

編集12/12/12:だから私はこれ以上運がなかった、そしてビューでgetLocalVisibleRectを使用してみましたが、残念ながら、アプリはSystemUIビューを所有していないため、オーバーレイの下にあるものを検出できません。私はカスタムROMでこれを行うことができると思いますが、rootなしのソリューションが必要です。

マーケットプレイスの他のアプリでも、上記の機能していない電話のステータスバーの検出で同じ問題が発生しているようです。例:クールなツール、オメガのステータスバーとステータスバー+。賞金が発生しました。

編集12/19/12写真を追加しました。動作中のデバイスでは、灰色の領域が黒い領域(現在フルスクリーンになっているアプリ)も「カバー」していることに注意してください。黒い領域は実際には画面全体をカバーしています。灰色の領域もオーバーレイとして表示しています。全画面表示(動作中/非動作中のデバイス、および表示されているかどうかに応じて、ステータスバーの高さをマイナスまたはプラスします)。

enter image description hereenter image description here

37
logray

うまくいけば、私はあなたがここで何をしているのか理解していますが、私のアプリ(TEAM BatteryBar)でも同様の問題がありました。 (ルート最小権限なし)

API11より下のデバイスではフルスクリーンを検出できませんでした(API11より上の一部の(Samsungのほとんどの)デバイスでは断続的です)。そこで、別のレイアウトパラメータを使用して2番目のレイアウトをWindowManagerに追加し、onLayoutをオーバーライドして、ウィンドウサイズをチェックしてstatusBarがまだ存在するかどうかを確認することで、カスタムリスナーを作成しました。そこから、メインビューに必要なことをすべて実行できます。

私はそれを片付けるつもりでしたが、うまくいきましたので、私はしませんでした:Pコードは1年以上前のもので、最初に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);
3
pvyParts

これは、システムが可視性を非表示に設定するダイアログウィンドウでタイトルバーを非表示にする場合と同じ問題である可能性があると思います。これにより、ダイアログウィンドウが誤って中央に配置されます。

そのために、これが私がそれを修正する方法です。これは状況に応じて機能する場合がありますが、ステータスバー識別子の名前に合わせて調整する必要がある場合があります。

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);
1
Chuck D