Androidでちょっとしたテキスト入力を受け取りたいとき、専用のActivityを作るのは面倒です。AlertDialog.Builder を使えば、ダイアログ内に入力項目(EditText)をサクッと追加できます。
しかし、ダイアログの結果は非同期で返ってくるため、通常の戻り値として受け取ることができません。そこで「コールバックインターフェース」を使った実装方法を紹介します。
1. コールバック用インターフェースの定義
まず、OKボタンが押されたときに入力文字列を渡すためのインターフェースを作成します。
Java
public interface InputDialogListener {
void onInputDialogOk(String inputText);
void onInputDialogCancel();
}
2. ダイアログ表示メソッドの実装
EditText を ScrollView と LinearLayout でラップすることで、画面からはみ出さないようにし、将来的な項目の追加にも対応しやすくしています。
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.Builder に setView() を使うことで、自由なレイアウトをダイアログに埋め込むことができます。ボタンクリック時の値を外に渡したい場合は、今回のように独自のリスナーを用意するのが一番シンプルで確実な方法です。



コメント