【Android】AlertDialogで入力フォームを作り、コールバックで値を受け取る

Android

Androidでちょっとしたテキスト入力を受け取りたいとき、専用のActivityを作るのは面倒です。AlertDialog.Builder を使えば、ダイアログ内に入力項目(EditText)をサクッと追加できます。

しかし、ダイアログの結果は非同期で返ってくるため、通常の戻り値として受け取ることができません。そこで「コールバックインターフェース」を使った実装方法を紹介します。

1. コールバック用インターフェースの定義

まず、OKボタンが押されたときに入力文字列を渡すためのインターフェースを作成します。

Java

public interface InputDialogListener {
    void onInputDialogOk(String inputText);
    void onInputDialogCancel();
}

2. ダイアログ表示メソッドの実装

EditTextScrollViewLinearLayout でラップすることで、画面からはみ出さないようにし、将来的な項目の追加にも対応しやすくしています。

Java

public void showInputDialog(String title, String defaultText, final InputDialogListener listener) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);

    // 入力フィールド(EditText)の設定
    final EditText input = new EditText(this);
    input.setInputType(InputType.TYPE_CLASS_TEXT);
    input.setText(defaultText);

    // レイアウトの調整(余白を持たせる)
    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);
    int padding = 40; // 適切なパディングを設定
    layout.setPadding(padding, padding, padding, padding);
    layout.addView(input);

    // スクロール可能にする
    ScrollView scrollView = new ScrollView(this);
    scrollView.addView(layout);

    builder.setView(scrollView);

    // OKボタンの設定
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            String text = input.getText().toString();
            if (listener != null) {
                listener.onInputDialogOk(text); // ここで値を返す
            }
        }
    });

    // キャンセルボタンの設定
    builder.setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            if (listener != null) {
                listener.onInputDialogCancel();
            }
            dialog.cancel();
        }
    });

    builder.show();
}

3. 呼び出し側のコード例

実際にこのメソッドを呼び出すときは、以下のようにリスナーをその場で実装(匿名クラス)して渡します。

Java

showInputDialog("ユーザー名入力", "なまえ", new InputDialogListener() {
    @Override
    public void onInputDialogOk(String inputText) {
        // 入力された文字を使った処理
        Toast.makeText(MainActivity.this, "入力: " + inputText, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onInputDialogCancel() {
        // キャンセル時の処理
    }
});

まとめ

AlertDialog.BuildersetView() を使うことで、自由なレイアウトをダイアログに埋め込むことができます。ボタンクリック時の値を外に渡したい場合は、今回のように独自のリスナーを用意するのが一番シンプルで確実な方法です。

コメント