2016年5月15日日曜日

Androidアプリ開発記 その4(ダイアログ)

Android開発記第4段。前回の予告通り、ダイアログについて調べてみました。
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みたいな簡単な使い方はできず、いちいちイベントリスナで処理してやらんといかんみたい。

なんでこんな面倒なの?

たかがダイアログひとつになんでこんな面倒なことしなきゃダメなんだ。JavaScriptを見習え!と言いたいところですが、どうやらこれはAndroidの設計思想らしいです。

UIスレッドを止めるな、と。

いつ制御が戻るかわからないとハングアップしてるのかと不安になるから、システムと常にコミュニケーションを取れるようにしておけ、ということなのかな。想像だけど。

次回予告

次は、いよいよ実際にアプリを作ってみます。何を作るかは見てのお楽しみ。

参考

0 件のコメント:

コメントを投稿