よく知られているTYPE_SYSTEM_OVERLAY
方法を使用して、常に他のビューの上にある全画面オーバーレイを作成しています。
ステータス バーが別のアプリによって非表示になっている場合、オーバーレイ ビューの各のサイズが自動的に変更されます (垂直方向に拡張されますMoto Atrix2 API15
) AVD
。オーバーレイは、他のすべてのビューの「上にとどまる」ように見えます。ステータス バーが再び表示されると、オーバーレイのサイズが再び自動的に縮小されます (垂直方向のピクセルが少なくなり、基本的にステータス バーの高さが差し引かれます)。API 10
17
これは望ましい動作であり、多くの異なるエミュレーターや少なくとも 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 オーバーライドがあります。
windowmanager
layoutparam
SYSTEM_ALERT、FLAG_LAYOUT_IN_SCREEN など、見つけることができるほぼすべてのものをいじってみました。これがわかるまで寝ません!
編集 11/30/12 : @deviant からこれを見つけました: https://stackoverflow.com/a/9195733/1851478これは基本的に私が行っていることですが、system_overlay を自動的にサイズ変更しない特定のデバイスに問題が残ります。おそらく、バグを発生させる必要があります。
詳細情報: ビュー ツリーの上部に全画面表示のアプリがあるときに再描画を強制した場合 (または単にオーバーレイ アプリをロードした場合)、オーバーレイはステータス バーが通常占有するスペースに描画されません (ただし、ステータスバーは描画時に表示されていないため、フルスクリーンの最前面ウィンドウの上にオーバーレイが「オーバーレイ」されていないように見えます(そして、私は多くのフルスクリーンアプリを作成してテストしましたそれらを全画面表示にするためのさまざまな方法)。これらのデバイスでは、(ステータス バーが表示されていなくても) オーバーレイをステータス バーの上に描画する唯一の方法は、 flag を使用するFLAG_LAYOUT_IN_SCREEN
ことですが、レイアウトのサイズは決して変更されず、常にフル スクリーンであり、したがって、これが一部のデバイスでは機能するが他のデバイスでは機能しない理由の元の問題に戻ります。
編集 12/12/12 :これ以上の運はありませんでした。ビューで getLocalVisibleRect を使用しようとしましたが、残念ながら、私のアプリは SystemUI ビューを所有していないため、オーバーレイの下にあるものを検出できません。カスタム ROM でこれを行うことができると思いますが、ルートなしのソリューションが必要です。
マーケットプレイスの他のアプリでも、上記の動作していない電話のステータス バーを検出するのと同じ問題が発生していることがわかります。例: クールなツール、オメガ ステータスバー & ステータスバー +. 報奨金が発生しました。
編集 12/19/12写真追加。動作中のデバイスでは、灰色の領域が黒い領域 (現在全画面表示になっているアプリ) も「カバー」し、黒い領域が実際には画面全体を覆っていることに注意してください。全画面表示 (動作中/非動作中のデバイス、および表示されているかどうかに応じて、ステータス バーの高さをマイナスまたはプラスします)。