TYPE_SYSTEM_* の Window があると Dialog が描画されない?

364 views
Skip to first unread message

nemo

unread,
Dec 12, 2012, 8:47:27 PM12/12/12
to android-...@googlegroups.com
こんにちは。突っ込みをお待ちしたいのですが。。。(すごい勘違いをしていないだろうか……という)

これはActivityの話です。
TYPE_SYSTEM_OVERLAY とか TYPE_TOAST などのSystem windowをWindowManger#addViewで作ったとします。
(ちなみに用途は「adbを使えない開発協力者向けのデバッグ情報表示」です)
タイミングは Activity#onAttachedToWindow 以降です。

このとき何らかのDialogがすでに表示されていれば,それよりも手前に重ねて表示されることになります。
が,この追加Windowを作ったあとで奥にDialogを表示(#show)しようとすると,これが「見えません」。
手前のWindowを透明にしようがinvisibleにしようがすごく小さくしようが,Dialogは描画されません。
レイアウトはされているようで,Dialog中のViewから #getLocationOnScreen などで座標を取ってみると
それらしい値ですし,#isShowing も true を返します。hiererchy viewerで見ても存在しています。

そういうものなの?と納得するにはちょっと早い感じがして,書いてみました。
Toastが表示されている間はDialogが描画されないなんてことはない気がするし……

お心当たりがありましたらコメントをください。よろしくお願いします。

----
nemo

nemo

unread,
Dec 13, 2012, 1:40:07 AM12/13/12
to android-...@googlegroups.com
セルフフォローですが,
WindowManager#addView を Service に追い出せば,この妙な衝突(競合? ロック?)はなくなります。
(TYPE_TOAST などの Window があっても Dialog が描画されます)
WindowManager の状態がなんぞ異なっているのだと思いますが……。

この場合もちろん,自前で addView した Window は Service のライフサイクルに乗ります。
当座のところは Activity の動作にあわせて Window の Attach / Detach をする IntentService を仕込みましたが,
なんだか無駄な道具を持ちだしている気がして釈然としません。

Keiji Ariyama

unread,
Dec 13, 2012, 2:54:56 AM12/13/12
to android-...@googlegroups.com
有山と申します。

 手元で確認しました。ActivityのContextで取得したWindowManagerでは、nemo
さんのおっしゃるようにダイアログが表示されませんでした。

WindowManager wm
= (WindowManager) getSystemService(WINDOW_SERVICE);

 以下のように、getApplicationContext()で取得したContextから得た
WindowManagerでは、ダイアログもTYPE_SYSTEM_OVERLAYのViewも、表示できました。
(ただし、TYPE_SYSTEM_OVERLAYの方が前面に表示されます。)

WindowManager wm
= (WindowManager) getApplicationContext()
.getSystemService(WINDOW_SERVICE);

 Activity内からSYSTEM_OVERLAYを生成するというのは、Activity終了時にリー
クの原因となる可能性もあって、あまり推奨されないような気がしますね。。。
--
Keiji,
ml_an...@c-lis.co.jp

nemo

unread,
Dec 13, 2012, 9:19:13 AM12/13/12
to android-...@googlegroups.com
nemoです,検証ありがとうございました。どうやらActivityと紐付けない形でWindowを作るのが必要なようですね。
なんだか納得できたようなできないような挙動ですが,Application の Context を使えば済むだけの話なら,
今回の用途としては「十分に手軽」で助かります。やってみます。(というかなんでさっきやらなかったんだろう……お手数をかけました)

Activity内からSYSTEM_OVERLAYを生成するというのは、Activity終了時にリー 
クの原因となる可能性もあって、あまり推奨されないような気がしますね。。。 

実用するとなると,おっしゃるとおりですね。
本件はデバッグ用途ですが,番兵的なDetach処理をところどころに書く羽目になっています。
私自身の今回の用途からすると,TYPE_APPLICATION_* で「Dialogより手前」が保証されるtypeがあってくれたらいいんですが……。

いずれにしてもありがとうございました。

----
2012年12月13日木曜日 16時54分56秒 UTC+9 C-LIS Keiji Ariyama:
Reply all
Reply to author
Forward
0 new messages