JavaScriptみたいに関数を一発呼ぶだけで済むのかと思ったら、意外と面倒でした。
勝手な予想
やってみる前は、JavaScriptのwindow.alert()とかwindow.confirm()みたいな(モーダル)ダイアログ関数を呼ぶだけで済むから簡単!と勝手に思っていました。どのボタンが選ばれたかは戻り値で判別できるだろうな、と。
いざ調べてみると、そもそもそんな関数が見つからない。ダイアログなんて基本的な機能だから用意されてるはずなのに。
結局どうなった?
AlertDialog.Builderクラスのインスタンスを生成して、タイトルやらメッセージやらボタン情報やらいろいろ設定して、show()メソッドで表示。コードはこんなかんじ。
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this)
.setTitle("Hell")
.setMessage("Hell Word!")
.setPositiveButton("OK", null)
.setCancelable(false);
alertDialogBuilder.show();
AlertDialog.Builderのインスタンスは、実行のたびに作らなくても一度だけ作って(Singleton)表示のたびにshow()をコールすれば環境にやさしいアプリになりそう。
実行してみる
![]() |
| 実行するとこうなります |
ポイント
AlertDialog.Builderのコンストラクタには、ダイアログの親アクティビティを指定。このコードを書いた時はMainActivity内で実行していたのでthisを指定した。- タイトルとかの文字列は、直接指定する他にも文字列リソースのIDも指定できる。こっちのほうが多言語化に便利。
- ボタンを押した時の挙動はイベントリスナで指定。
show()の戻り値で判別できない。何も処理しない場合はnullでOK。 show()をコールしたらすぐ次の処理に進む。ダイアログを閉じるまで待ってくれない。
なんでこんな面倒なの?
たかがダイアログひとつになんでこんな面倒なことしなきゃダメなんだ。JavaScriptを見習え!と言いたいところですが、どうやらこれはAndroidの設計思想らしいです。UIスレッドを止めるな、と。
いつ制御が戻るかわからないとハングアップしてるのかと不安になるから、システムと常にコミュニケーションを取れるようにしておけ、ということなのかな。想像だけど。

0 件のコメント:
コメントを投稿