ボタンクリック時の処理を設定したアラートダイアログを表示

広告

ダイアログを表示した時に、単にメッセージを表示させるだけであればデフォルトのボタンの処理で構いませんが、ボタンをクリックされた時に何らかの処理を行いたい場合には、ボタンに対してイベント処理を設定します。

まずボタンが1つだけの場合のダイアログを表示させてみます。「AlertDialog」クラスで用意されているstaticメソッドである「show」メソッドを使います。前のページで利用したメソッドと同じですが引数が異なります。

Display a simple alert dialog. This convenience method constructs an 
AlertDialog and shows it.

Parameters:
  context  the context in which this alert is created.
  title  the title to be shown in the alert, pass null will not show 
    a title
  message  the alert message in the alert.
  buttonText  the text to be shown in the button, pass null will make
    the alert buttonless.
  buttonListener  a DialogInterface.OnClickListener to be notified 
    when the button is clicked
  cancelable  if true, clicking the BACK button will dismiss the alert.
  cancelListener  if cancelable, this DialogInterface.OnCancelListener's 
    onClick method will be called when the BACK button is clicked.

1番目の引数には引数にはダイアログを作成する元になった「Context」クラスのオブジェクトを指定します。ここでは(「Activity」クラスを継承したクラスのオブジェクトの)自分自身を表す「this」を指定して下さい。

2番目の引数にはダイアログのタイトルに表示される文字列、3番目の引数にはダイアログにメッセージとして表示される文字列、4番目の引数にはダイアログに設置されるボタンに表示される文字列を指定して下さい。

5番目の引数には「DialogInterface.OnClickListener」インターフェースを実装したクラスのオブジェクトを指定します。ボタンがクリックされた時のイベント処理を行う部分となります。後のサンプルでは自分自身に「DialogInterface.OnClickListener」インターフェースを実装してます。このような場合は自分自身を表す「this」を指定します。

6番目の引数にはエミュレーターの「Back」キー(又はキーボードの「ESC」キー)を有効にするかどうかを設定します。「true」を設定した場合は通常と同じく「Back」キーによって一つ前の画面に戻ります。「false」を設定した場合は「Back」キーが無効となりボタンをクリックしないとダイアログは閉じません。

7番目の引数には「DialogInterface.OnCancelListener」インターフェースを実装したクラスのオブジェクトを指定します。6番目の引数で「true」が設定された場合にキャンセル処理が行われた時のイベント処理を行う部分となります。後のサンプルでは自分自身に「DialogInterface.OnCancelListener」インターフェースを実装してます。このような場合は自分自身を表す「this」を指定します。

※「DialogInterface.OnClickListener」インターフェースの詳細については「DialogInterface.OnClickListenerインターフェース」を参照して下さい)。

※「DialogInterface.OnCancelListener」インターフェースの詳細については「DialogInterface.OnCancelListenerインターフェース」を参照して下さい)。

具体的には次のように記述します。

package jp.javadrive.android;

import android.app.Activity;
import android.os.Bundle;
import android.app.AlertDialog;
import android.content.DialogInterface;

public class Test extends Activity implements 
    DialogInterface.OnClickListener, DialogInterface.OnCancelListener{

    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        AlertDialog.show(this, "Test", "Hello", "ok", this, true, this);
    }

    public void onClick(DialogInterface dialog, int whichButton) {
    }

    public void onCancel(DialogInterface dialog) {
    }
}

※簡略化するために上記のように記述していますが、上記では一瞬表示されて消えてしまいます。より具体的には下記のサンプルを見てください。

サンプルプログラム

それでは実際に試してみます。プロジェクトを作成しソースコードを次のように変更しました。

Test03_01.java

package jp.javadrive.android;

import android.app.Activity;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.app.AlertDialog;
import android.content.DialogInterface;

public class Test03_01 extends Activity implements 
    DialogInterface.OnClickListener, DialogInterface.OnCancelListener{

    private final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT;
    private TextView tv;

    @Override protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);

        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(linearLayout);

        final Button button = new Button(this);
        button.setText("Open Dialog");
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                AlertDialog.show(Test03_01.this, 
                                 "Alert Test", 
                                 "Hello, This is Alert Dialog.", 
                                 "ok",
                                 Test03_01.this, 
                                 true,
                                 Test03_01.this);
            }
        });
        linearLayout.addView(button, 
          new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));

        tv = new TextView(this);
        linearLayout.addView(tv, 
          new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT));
    }

    public void onClick(DialogInterface dialog, int whichButton) {
        tv.setText("ok");
    }

    public void onCancel(DialogInterface dialog) {
        tv.setText("cancel");
    }
}

ビルド後にエミュレーター上で実行します。

ボタンクリック時の処理を設定したアラートダイアログを表示

画面に表示されたボタンをクリックして下さい。ダイアログが表示されます。

ボタンクリック時の処理を設定したアラートダイアログを表示

では「ok」ボタンをクリックして下さい。ダイアログが閉じ、ボタンクリック時の処理として画面に「ok」が表示されます。

ボタンクリック時の処理を設定したアラートダイアログを表示

同じようにダイアログを表示させてから、今度は「Back」キーをクリックして下さい。ダイアログが閉じ、画面に「cancel」が表示されます。

ボタンクリック時の処理を設定したアラートダイアログを表示

ボタンクリック時の処理を設定したアラートダイアログを表示

( Written by Tatsuo Ikura )