Activityにダイアログ表示機能を付加する

Android SDKでは、何か共通で使う機能を追加したい場合は、まずはActivityを拡張することを推奨している。

例えば日付や時間をセットする、以下のダイアログを標準的にアプリケーションに組込みたいとしよう。

日付を入力するDatePickerDialog

時間を入力するTimePickerDialog

Activityには以下のイベント用メソッドがあり、ダイアログを表示する機能を簡単に組込むことができるのだ。

  • ダイアログを生成する
protected Dialog onCreateDialog(int id) {
    return null;
}

onCreateDialogはshowDialogメソッド内部で呼ばれるが、初期の実装は空であり、idで識別できるダイアログを生成して返すことを前提にしている。
例えばidを区分として日付又は時間を入力する機能を付加することを目的として、同メソッドをオーバライドしてみよう。

public static final int TIME_DIALOG_ID = 0; //時間入力
public static final int DATE_DIALOG_ID = 1; //日付入力

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
        case TIME_DIALOG_ID:
            return new TimePickerDialog(this,
                    this, this.hour, this.minute, false);
        case DATE_DIALOG_ID:
            return new DatePickerDialog(this,
                    this,
                    this.year, this.month, this.day);
    }
    return null;
}

他にもカスタマイズされたいろいろなダイアログを呼び出すロジックを書けるだろう。※

  • ダイアログを表示する前
protected void onPrepareDialog(int id, Dialog dialog) {
    dialog.setOwnerActivity(this);
}

こちらはパラメタの引数として表示対象のダイアログがセットされるので、表示直前にダイアログをカスタマイズしたり、前処理を実施することができる。デフォルトではダイアログのオーナとなるActivityをセットするだけの処理が書かれている。

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {
        case TIME_DIALOG_ID:
            ((TimePickerDialog) dialog).updateTime(this.hour, this.minute);
            break;
        case DATE_DIALOG_ID:
            ((DatePickerDialog) dialog).updateDate(this.year, this.month, this.day);
            break;
    }
    super.onPrepareDialog(id, dialog);
}

この例ではダイアログが日付を入力するか時間を入力するかによって、初期値をセットを分けている。

生成したダイアログはshowDialogメソッドで表示する。

buttonYearMonth.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATE_DIALOG_ID);
    }
});

パラメタにはonCreateDialogで指定したidを取るため、どのダイアログを表示するかを指定できる。また、ダイアログを明示的に閉じるにはdismissDialogメソッドを使用するが、同様のパラメタを取る。

なお、showDialogメソッドを呼び出した際にActivityクラス内部ではmManagedDialogsという変数に表示したダイアログを格納し、dismissDialogでは同変数からダイアログを取り除いており、インスタンス管理機能も最初から実装されている。

Androidのような携帯端末ではキーボードからの入力というのは基本的には考えず、できるだけ少ない操作で、できるだけ簡単に情報を選択、入力して貰う必要があるため、ダイアログを表示するのは非常に重要な機能だ。
今回の例のようにDatePickerやTimePickerのような出来合いのものから、カスタマイズされたダイアログまでを簡単に表示管理する機能がActivityには最初から備わっており、こいつを使わない手は無いのである。

※単なる識別子としてもidだけではなく、Androidリソースを識別するid(Layout.xml)を使えば様々なダイアログを表示するのに使えるだろう。