ダイアログは永遠に(1) - AlertDialog
ダイアログのはじめのいっぽとして、使いやすく,機能も豊富なAlertDialogを表示してみる。
はじめてのダイアログ
まずは、簡単なAlertDialogのサンプルを示す。
このプログラムを実行して、「ダイアログの表示」ボタンを押すと、以下のように表示される。
AlertDialogのコンストラクタは、protected宣言されていて直接コントラクタを使って、インスタンスを生成する事はできない
AlertDialogを使うには、AlertDialog.Builderクラスのインスタンスを生成して、このビルダークラスよりアクセスする。
AlertDialog.Builderクラスのコンストラクタの引数には、通常,親となるActivityクラスのインスタンスを指定する。
25行目のAlertDialog.Builderクラスのコンストラクタの引数である「AlertDialogSample.this」は、無名クラスである View.OnClickListenerの アウタークラスAlertDialogSampleのインスタンス、つまりActivityクラスのインスタンスを指している。
あまり使う事は無いが、AlertDialogそのもののインスタンスを取得する時には、以下のようにAlertDialog.Builderクラスのcreateメソッドを使用する。
強いて、AlertDialogのインスタンスを取得して,これを使ってダイアログを表示するとすると、最初のサンプルの28行目を以下の2行で置き換える事になる。
AlertDialog.Builderクラスのメソッドは、ほとんどが自分自身のインスタンスを返すので、 最初のサンプルのonClickメソッド内のコードは「.」(ドット)で連結して、以下のように簡潔に記述する事ができる。
表示されているダイアログは、「戻るボタン」で前の画面に復帰できるが、次の「ダイアログにボタンを表示する」の例のように、 setCancelableメソッドを使ってこれを禁止する事ができる。
その場合には、この例のようにDialogクラスのcancelメソッドを使うか、またはdismissメソッドを使ってダイアログを閉じるための手段が必要になる。
ダイアログにボタンを表示する
AlertDialogには、あらかじめ「positive」、「 neutral」、「 negative」という3つのボタンが組み込まれている。
この3つボタンを、どの目的に使ってもまた使わなくても自由である。
以下のコード、「positive」と「 negative」の2つのボタンを使ったAlertDialogの例である。
最初のサンプルのonClickメソッド内を、このコードに修正して「ダイアログの表示」ボタンを押すと、 以下のように表示される。
「positive」ボタンに使われている「Yes」ボタンを押すと、アクティビティのfinishメソッドが実行されて、アプリケーションは終了する。
「 negative」ボタンに使われている「No」ボタンを押すと、AlertDialogの.cancelメソッドが実行されて、アプリケーションは終了する。
setCancelableメソッドの引数にfalseを指定しているので、戻るボタンでダイアログを閉じることはできない。
ウィジェットのイベントリスナーは、Viewクラスの内部インターフェースであったが、ダイアログのイベントリスナーはDialogInterfaceクラスの内部インターフェースを使う。
イベントリスナーのonClickメソッドの引数dialogには、イベント発生源のDialogクラスのインスタンスが、idにはどのボタンが押されたかを識別する番号が渡される。
ダイアログにリストを表示する
setItemsメソッドを使って、ダイアログに以下の画面のようなリストを表示させる事ができます。
以下に、そのコードを示します。
最初のサンプルのonClickメソッド内を、以下のように修正します。
リストの内の1つを選択すると、ボタンの表示ラベルが変更されます。
ダイアログにラジオボタンを表示する
setSingleChoiceItemsメソッドを使って、ラジオボタンを表示させる事ができます。
最初のサンプルのonClickメソッド内を以下のように修正します。
setSingleChoiceItemsの2番目の引数の値は、デフォルトの選択項目を指定します。
この値に-1を指定すると、デフォルトでは何も指定されなくなります。
リストを表示するsetItemsメソッドとは異なり、項目を選択してもダイアログボックスは表示されたままとなります。
ここでは、選択が完了した時にダイアログを閉じるためのボタンとして、「positive」ボタンを利用しています。
ダイアログにチェックボックスを表示する
setMultiChoiceItemsメソッドを使って、ラジオボタンを表示させる事ができます。
最初のサンプルのonClickメソッド内を以下のように修正します。
setMultiChoiceItemsの2番目の引数には、デフォルトで項目が選択されているかどうかを示す論理値を、配列で指定します。
ここでは、ダイアログを表示した時に最初の項目と2番目の項目が、選択状態となります。
カスタムダイアログを表示
setViewメソッドを使うと、アクティビティで画面のレイアウトを使ってウィジェットを 配置したように、自由にViewオブジェクトを配置して、カスタマイズしたダイアログを表示させる事ができます。
レイアウトファイルを使う
最初のサンプルのonClickメソッド内を以下のように修正します。
このプログラムで使用している、次のようなダイアログのレイアウト用のxmlファイル 「custom_dialog.xml」を/AlertDialogSample/res/layout/デレクトリに配置します。
LayoutInflaterオブジェクトの取得
24行目で、レイアウトファイルのViewオブジェクトを取得するために、LayoutInflaterオブジェクトを取得しているが、 LayoutInflaterオブジェクトを取得するには、この他にも次のコードを使う事もできる。
または
コードで直接Viewオブジェクトを生成
setViewメソッドの引数であるViewオブジェクトは、以下のコードのようにレイアウトのxmlファイルを使用せずに、 コードで直接Viewオブジェクトを生成する事もできる。
いっしょに使えるものと使えないもの
最後に、ちょっと実験をしてみた。
以下のようなコードを用いて、AlertDialogで表示できるものをテンコモリで表示してみた。
最初のサンプルのonClickメソッド内を、以下のように修正します。
プログラムを実行してみると、以下のようなダイアログが表示される。
この画面をみると、setMessage,setItems,setSingleChoiceItems,setSingleChoiceItems,setMultiChoiceItemsメソッドで、 表示しようとしている部分が正しく表示されていない。
どうやら、表示領域が重なっていて、この5つのメソッドを同時使う事はできないようだ。
参考URL
-
Creating Dialogs Android Developers
ダイアログ全般に関するドキュメント。
サンプルコードは、このページからのパクリが多いがあしからず。 -
AlertDialog Android Developers
AlertDialogのリファレンス。 -
AlertDialog.Builder Android Developers
AlertDialog.Builderのリファレンス。