Android ダイアログ(2) -カスタムダイアログ-


前回までは、AlertDialog という既成のダイアログを表示させる例をとりあげてきました。今回は、カスタムダイアログの作成と表示について取り上げます。

時刻設定用には TimePickerDialog という既成のダイアログがあります。ここでは簡単な例として、時刻設定にチェックボックスを追加して、チェックできるカスタムダイアログを作成してみます。

まず最初にダイアログのレイアウトを定義し、res/layout に xml ファイルとして保存します。ここでは、res/layout/test_dialog.xml を以下のように定義しました。

次に、onCreateDialog 内で上記のレイアウトをダイアログに適用します。
今回はカスタムダイアログなので、(Builder を使わず) Dialog のインスタンスを直接生成します。そして、setContentView を使ってレイアウトを適用します。

1.DialogFragment を使用しない場合

2.DialogFragment を使用する場合
(誤って DialogFragment を使用しない場合のコードを載せていたので修正しました)

上記ダイアログを表示すると、以下のようになります。

Custom Dialog

定義したダイアログの表示方法については、Android ダイアログ(1)
を参照してください。

[関連記事]
Android ダイアログ(1)
Android ダイアログ(1)-2

Android ダイアログ(1) – 2 補足


Android ダイアログ(1)の補足記事です。

ボタンを追加する方法を説明している箇所で DialogFragment を使用した場合の例のみを紹介していましたので、従来の Activity を使用した例を以下に紹介します。

DialogFragment を使用した場合は、その中にリスナーと onCreateDialog を配置しました。DialogFragment を使用しない場合は、両方共、Activity 内に配置します。


getActivity() は、Activity のメソッドではないので、this (匿名クラスから外側のクラスを参照するので、MainActivity.this)に置き換えています。

[関連記事]
Android ダイアログ(1)
Android ダイアログ(2) -カスタムダイアログ-

Android ダイアログ(1)


最近、アプリケーション内でダイアログを扱う必要が出てきて試行錯誤したので、その記録をまとめます。

まず、ダイアログの基本から。

ダイアログは小さなウインドウです。ユーザに注意を促したり、簡単な入力等に使用します。小さな Activity と考えることもできますが、クラス Dialog と Activity との間に継承関係はありません。

では、実際のコードを見ていきます。

例えば、既成のダイアログである AlertDialog のインスタンスを生成するコードは、以下のようなものです。


上記コードに return dialog を追加し、onCreateDialog メソッドに記述します。ただし、onCreateDialog を実装する場所は、以下の2種類があります。

  1. ActivityonCreateDialog メソッドをオーバーライドする。
  2. DialogFragmentonCreateDialog メソッドをオーバライドする。

1 の方法は、古い Android のバージョンにも対応できる方法ですが、現在は非推奨となっています。一方、2 の方法は、API Level 15(Android Version 4.0.3)以降で利用できます。ただし、現在はサポートライブラリを使用すれば API Level 4(Android Version 1.6)以降で利用できるので、こちらの方法が推奨されています。

それぞれの場合のコード例を以下に示します。

ここでは、比較しやすいようにアラートを表示するメソッド MainActivity.showAlert() を定義し、MainActivity.onCreate 内で以下のように、showAlert() を呼び出すこととします。


[例1]

Activity.onCreateDialog を使う場合


ダイアログを表示するには Activity.showDialog メソッドを呼び出すだけでよく、それによって Activity.onCreateDialog が実行されてダイアログが生成され、表示されます。

なお、AlertDialog.Builder の引数は、ダイアログを表示させるコンテキストです。DialogFragment 内では getActivity() を使いますが、Activity 自身が Context を継承していますので、ここでは this を渡しています。

[例2]
DialogFragment を使う場合


ダイアログを表示させるには、上記 showAlert に記述しているように、定義した DialogFragment(の派生クラス)をインスタンス化し、show メソッドを呼び出します。その際、FragmentManager を引数に与える必要があります。

なお、上記コードはサポートライブラリを使用した場合の例なので、サポートライブラリを使わない場合(Android 4.0.3 以上のみを対象とする場合)と比べて以下の様な修正をしてあります。(詳細は、Android サポートライブラリの使い方 を参照してください)

  1. 呼び出し側アクティビティ は、(Activity ではなく)FragmentActivity の派生クラスとする
  2. getFragmentManger メソッドでなく、getSupportFragmentManager メソッドで FragmentManager を取得する

どちらの[例]でも、以下の様にダイアログが表示されます。「戻る」ボタンを押すと、ダイアログを表示する前のアクティビティに戻ります。

AlertDialog.Builder のメソッドを使って、ボタンを追加する事もできます。

ここでは、ダミーとして、以下のリスナーを用意します。(R.string.ok, R.string.cancel には、ボタンに表示する文字列を定義してあります。)


setPositive/NegativeButton メソッドでボタンをセットします。


(Activity を使用した場合のコードについては、Android ダイアログ(1) – 2 補足 を御覧ください)

以下のようなダイアログになりました。

今回は、既成のダイアログ AlertDialog を使いました。次回は、カスタムダイアログについてまとめる予定です。

[関連記事]
Android サポートライブラリ
Android サポートライブラリの使い方
Android ダイアログ(1) – 2 補足
Android ダイアログ(2) -カスタムダイアログ-