2012-11-29 9 views
37

よく知られているTYPE_SYSTEM_OVERLAYメソッドを使用して、常に他のビューの上にあるフルスクリーンオーバーレイを作成しています。ステータスバーが別のアプリケーションによって隠されている場合ステータスバーの可視性を検出する/ TYPE_SYSTEM_OVERLAYが自動的にサイズ変更されない

17スルーAPI 10からMoto Atrix2 API15AVDためにオーバーレイビューは、(垂直に拡大)に自動的にリサイズ。オーバーレイは他のすべてのビューの「上に」表示されているように見えます。ステータスバーが再度表示されると、オーバーレイは自動的にサイズを自動的に縮小します(垂直ピクセルは少なく、基本的にステータスバーの高さを減算します)。

これは望ましい動作であり、多くの異なるエミュレータや少なくとも1台のデバイスメーカー(モトローラ)で動作しているため、これが例外または欠陥のある動作ではないと思う傾向がありますが、 「tはaddtl devices.

問題へのアクセスがあります。また、Kindle Fire (API10?)上でテストSamsung GS2 (API15) &でをステータスバーが別のアプリケーションによって隠されているとき、オーバーレイが自動的に(ステータスバーは、かつてのスペースを埋める)サイズは変更されません。 (フルスクリーンアプリの背後にあるステータスバー)。これらのデバイスでは、ビューを作成した後、最初にビューの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:だから私のアプリはそれができるSystemUIビューを所有していないので、残念ながら私はこの上の任意のさらなる運を持っていなかった、と私はビューにgetLocalVisibleRectを使用してみましたが、オーバーレイの下にあるものを検出しません。私はこれを行うことができるカスタムROMと思うが、私は根なしの解決策が必要です。

マーケットプレイスの他のアプリは、上に挙げた非稼働中の電話機のステータスバーを検出するのと同じ問題を抱えています。例:クールツール、オメガステータスバー&ステータスバー+。バウンティは育てた。

編集12/19/12写真が追加されました。作業中のデバイスでは、灰色の領域も黒い領域(現在フルスクリーンのすべてのアプリケーション)をカバーしています。黒い領域は実際には画面全体をカバーしていますが、灰色の領域もオーバーレイとして表示していますフルスクリーン(作業中/使用中のデバイスおよび表示中かどうかに応じてステータスバーの高さをマイナスまたはプラスします)。

enter image description hereenter image description here

+0

あなたは、必要な行動のスクリーンショットを追加してください。 –

+0

@写真が追加されました。 – logray

+0

フルスクリーン表示にしましたか?あなたのビューを追加する前に試してみてください: //全画面表示 WindowManager.LayoutParams attrs = mActivity.getWindow()。getAttributes(); attrs.flags | = WindowManager.LayoutParams.FLAG_FULLSCREEN; mActivity.getWindow()。setAttributes(attrs); –

答えて

1

私は、これは、システムが隠された代わりのゴーンに可視性を設定し、ダイアログウィンドウ上のタイトルバーを非表示にすると、同じ問題かもしれないと思います。これにより、ダイアログウィンドウが正しく中央揃えされます。

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

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

私はかなりこれがルート(およびおそらくカスタムSystemUI.apk)を必要とするだろうと確信しています。二次的には、ステータスバーを表示しているかどうかを検出するだけで、ステータスバーを隠すことに本当に関心がありません。私はこのいくつかで遊んでいますが、私は希望がありません。 – logray

+0

私は自分のアプリが所有していないビューの可視性を設定することに成功しなかった...試してくれてありがとう。 – logray

3

願わくば私はあなたの後ろにいることを理解していますが、私のアプリ(TEAM BatteryBar)では同様の問題がありました。 (ルートの最小限のアクセス許可なし)

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

私はそれを整えようとしていましたが、それはうまくいきませんでした。Pコードは1年以上経過していて、最初はアンドロイドのコーディングを開始しています。思考のための食べ物tho。それが役に立てば幸い。

here is the code in a repo at my 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); 
+0

私はOnFullScreenListenerを試しますが、基本的にあなたの答えはちょうど私がすでに試したのと同じことをやり直しています。私が文書化したことはすべてのデバイスで動作しません。それはいくつかで動作しますが、他のものではありません(一見説明なし)。非動作デバイスでは、オーバーレイレイアウト上でOnFullScreenListener、OnGlobalLayoutListener、またはonSizeChangedをオーバーライドしていても、メソッド(および鉱山/逸脱者)は自動的にオーバーレイのサイズ変更を検出していないようです。 – logray

+0

あなたのコードを見て、あなたはonLayoutをオーバーライドしています。これは、私が既に動作していないデバイスでは成功しなかったものです。私の例/質問では、onSizeChangedをオーバーライドし、膨らんだオーバーレイレイアウト内で可能なすべてのビューメソッドをオーバーライドしようとしました(ほぼ同じように)。 – logray

+1

お試しいただきありがとうございます。私はあなたのコードを試してみました。単語や同じ問題がありましたが、onLayoutはビューが初めて追加されたとき(または設定変更時)にのみ呼び出され、サービス(またはビュー)が破棄/削除され、作成/追加されるまで再び。そして、たとえ繰り返して画面を追加したり削除したりしても、画面のフラグにレイアウトを追加しない限り、縦のサイズは変わりません。少なくとも三星GS2 API15でテストされたので、基本的に同じ問題。 BTW onSystemUiVisibilityChangeも機能しません。私はそれからイベントを得ることはありません:GS2デバイスは、物理的なナビゲーションキーを持つICSです。 – logray

関連する問題