なんか、Androidでのダイアログ表示の仕方って、
いろんなサイト見ていると、AlertDialog.Builder#show()呼び出しているがすごく多い。
「Android ダイアログ 表示」とかで検索するとそれはもういっぱい引っかかる。
たしかに、それで表示は出来るんだけどさ。
正しくは動かないと思う。裏で。
showってメソッド、普通は、voidかbooleanだと思うの。
でも、Andoridだと、Dialogなインスタンスが戻ってくるの。
なんか疑問に思ったりしないかなぁ?
開発ガイドのダイアログ作成部分には、
AlertDialog#showなんてメソッドは一切記載がなかったりするんだけどね。
開発ガイド読んでないのかな。
まぁ、別に読んでないのはわたしも一緒だからいいんだけど、
やばいコードは余り広めない方がいいと思うんだよね。
え?ダイアログちゃんと表示されるじゃん、って人は、
開発環境とかでログを表示しながら、実際にダイアログを表示して、縦横切り替えをしてみるといいと思うの。
「android.view.WindowLeaked」って表示されるんじゃないかな〜。
いろいろ試して起きなければ、きっと、正しく作られてるから大丈夫だよ!
Dialogは、Activityの一部として扱われるから、Activityのライフサイクルにのせてあげないといけないの。
のせないなら、自前でちゃんと管理しないとダメってことね。
ライフサイクルにのせる方法は、ActivityのonCreateDialog(int)で生成してreturnで返してあげるしかないみたい。
Dialog#setOwnerActivityを使ってもダメだったから、今のところそれしか方法無いのかなーってわたしは思ってる。
ここで、showの返値がDialogになってる理由がちょっとわかる。
そう、AlertDialog.Builderでshowすると、返値がDialogじゃないとライフサイクルに載せられないってことね。
ちなみに、new AlertDialog.Builder(this)みたいにしてActivityセットしてるよ?って言う人は、
もう一度API見てください。引数がContextになってるはず。
なので、そこはActivityである必要はなく、ライフサイクルにものらない(のってもいい気はするけど)。
あ、そうそう、さっきの縦横切り替えで大丈夫じゃん。って思った人。
あと、縦横切り替えでダメなら、AndroidManifest.xmlのAcitivityの属性に、
「android:configChanges="orientation|keyboardHidden"」書けばいいじゃんって思った人。
RootActivity以外でDialog表示して、Homeキーとかおして別の重いアプリとか起動してみるといいんじゃないかなー。
きっと、裏でActivityが終了して同じエラーが出るよ(試してないけどね!)。
結局onCreateDialog(int)のintには
何が入るの?というお話でした。
メソッド呼び出しの流れで行くと、
showDialog(int)→onCreateDialog(int)だね。
オブジェクト指向な感じで行くと(とか言うほどじゃないけど)、
これは、『誰が』呼ぶのかってところがポイントかなぁ?
showDialog(int)は、みんなが作ってるActivityさんが呼ぶのね。
そして、onCreateDialog(int)を呼ぶのは、その親のAndroidさんなの。
ということで、あとは、元の記事とかを参照すると、
onCreatDialogは、ダイアログを識別するために、showDialogの引数にあなたが与えるもの。
つまり、あなた自身がダイアログの識別用にintの値を決めてあげていいんだよっ。
これで解決?('-^*/
Activityからは、onCreateDialog(int)を直接呼ぶんじゃなくて、showDialog(int)を呼んであげてね〜(゜▽、゜
This method is deprecated
です
はいはい、そうだねー。deprecatedだね。
ただ条件付きかな。API Level 8以上で作成しているのであれば、
APIリファレンスにあるようにonCreateDialog(int, Bundle)を使った方がいいね。
たいていの人は、まだAPI Level 4か7で作ってるんじゃないかと思うけどね(笑)
実際、API Level 4とかで作ってるとわかるけど、
ダイアログ作成時に動的なパラメーターを渡すのが非常にめんどくさい。
というか、安全に渡す方法とか考え出すと夜も眠れなくなるよね。
新しいAPIを使うとそんなことを解決してくれるよね。
ちなみに、コメントくれた方はAPI Level 8で作ってるのかな。
API Level 8だとAndroid2.2以上になっちゃうからね。気をつけて。
アプリ公式リリースしているならわかると思うけど、
まだまだ2.1とか1.6とかもいっぱいあるしね。
ちなみに、3.0でDialogFragmentが出てきて、
互換ライブラリ(って言うのかな?)もあるみたいだから、
上のどちらよりも、そっちの方がいいんじゃないかな、とか思ってるよ(笑)
まだ勉強してないけどね。