なんか、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が終了して同じエラーが出るよ(試してないけどね!)。