テキスト入力やリスト選択のAlertDialogを表示する方法
ソースコード
MainActivity.java と activity_main.xml をまとめてダウンロードする場合
・20140409-alertdlg-src.zipをダウンロードする
下準備(Fragment無効化とボタン押下イベントハンドラの記述法)
『(Android) フラグメント fragment_main を使う場合・使わない場合』で書いたように、Fragmentを使わないようにADTが自動生成したソースコードを修正する。
その上で、XMLで画面インターフェースを設計する。緑の部分はAlertDialogから読み書きするところ。赤の部分はXMLでイベントハンドラの関数を定義しているところ。(XMLでイベントハンドラを定義しない場合、onCreate関数内で定義してやれば良い)
※ なお、GoogleのADTサンプルでは、onCreate内でイベントハンドラを定義している
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:inputType="text"
android:width="@dimen/dialog_fixed_width_major" >
<requestFocus />
</EditText>
<CheckBox
android:id="@+id/checkBox1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:text="CheckBox" />
<ToggleButton
android:id="@+id/toggleButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/checkBox1"
android:text="ToggleButton" />
<Button
android:id="@+id/button_ok_dlg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/toggleButton1"
android:onClick="onClickButton_OkDlg"
android:text="OK AlertDialog"
android:width="@dimen/dialog_fixed_width_major" />
<Button
android:id="@+id/button_yn_dlg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickButton_YnDlg"
android:layout_below="@+id/button_ok_dlg"
android:text="Y/N AlertDialog"
android:width="@dimen/dialog_fixed_width_major" />
<Button
android:id="@+id/button_input_dlg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickButton_InputDlg"
android:layout_below="@+id/button_yn_dlg"
android:text="TextInput AlertDialog"
android:width="@dimen/dialog_fixed_width_major" />
<Button
android:id="@+id/button_list_dlg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button_input_dlg"
android:text="List AlertDialog"
android:width="@dimen/dialog_fixed_width_major" />
<Button
android:id="@+id/button_list_dlg2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button_list_dlg"
android:text="SingleSelect AlertDialog"
android:width="@dimen/dialog_fixed_width_major" />
<Button
android:id="@+id/button_check_dlg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button_list_dlg2"
android:text="CheckBox AlertDialog"
android:width="@dimen/dialog_fixed_width_major" />
<Button
android:id="@+id/button_quit"
android:drawableLeft="@android:drawable/ic_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button_check_dlg"
android:onClick="onClickButton_Quit"
android:text="Quit"
android:width="@dimen/dialog_fixed_width_major" />
</RelativeLayout>
画面は次のような感じになる。

MainActivity.javaの共通部分は次のような感じになる。赤の部分は、XMLではなくonCreate内でボタン押下のイベントハンドラ関数を定義している部分。緑の部分は「Quit」ボタンを押した時のイベントハンドラ関数。
MainActivity.java
package com.example.android_actiondlg_test_1;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;
import android.widget.Button;
import android.view.View.OnClickListener;
import android.app.AlertDialog;
import android.widget.EditText;
import android.text.InputType;
import android.widget.CheckBox;
import android.widget.ToggleButton;
import android.content.DialogInterface;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ボタン押下イベントリスナーの登録
Button button = (Button)findViewById(R.id.button_list_dlg);
button.setOnClickListener(mButtonListDlgListener);
button = (Button)findViewById(R.id.button_list_dlg2);
button.setOnClickListener(mButtonListDlg2Listener);
button = (Button)findViewById(R.id.button_check_dlg);
button.setOnClickListener(mButtonCheckboxDlgListener);
button = (Button)findViewById(R.id.button_quit);
button.setOnClickListener(mButtonQuitListener);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
〜 ここに、ボタン押下時のイベントハンドラ関数を書く 〜
// 終了ボタン
private OnClickListener mButtonQuitListener = new OnClickListener() {
public void onClick(View v) {
finish();
}
};
}
OKボタンのみのダイアログ

MainActivity.java
// OKボタンのみのAlertDialogを表示する
public void onClickButton_OkDlg(View view) {
// AlertDialogを構築する
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setIcon(android.R.drawable.ic_dialog_info);
dlg.setTitle("OKボタンのみのAlertDialog");
dlg.setMessage("ダイアログに表示する文字列");
dlg.setPositiveButton("OK", null);
// AlertDialogを表示する
dlg.show();
}
Yes/Noボタンのダイアログ

MainActivity.java
// Y/NボタンのAlertDialogを表示し、Yesが選択された場合はEditTextに文字列を設定する
public void onClickButton_YnDlg(View view) {
// AlertDialogを構築する
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setTitle("Y/NボタンのAlertDialog");
dlg.setMessage("ダイアログに表示する文字列");
dlg.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
//Yesボタンが押された時の処理
Toast.makeText(MainActivity.this, "Yesが押されました", Toast.LENGTH_LONG).show();
EditText text1 = (EditText) MainActivity.this.findViewById(R.id.editText1);
text1.setText("Yesが押されました");
}});
dlg.setNegativeButton("No", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
//Noボタンが押された時の処理
Toast.makeText(MainActivity.this, "Noが押されました", Toast.LENGTH_LONG).show();
}});
// AlertDialogを表示する
dlg.show();
}
テキスト入力のダイアログ

MainActivity.java
// テキスト入力のAlertDialogを表示し、入力された値をEditTextに設定する
public void onClickButton_InputDlg(View view) {
final EditText editView = new EditText(MainActivity.this);
editView.setLines(1); // 1行
editView.setInputType(InputType.TYPE_CLASS_TEXT); // 改行を許可しない
// AlertDialogを構築する
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setTitle("テキスト入力のAlertDialog");
dlg.setMessage("ダイアログに表示する文字列");
// テキストボックスに初期値を入力する
dlg.setView(editView);
EditText text1 = (EditText) MainActivity.this.findViewById(R.id.editText1);
editView.setText(text1.getText().toString());
dlg.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
//Yesボタンが押された時の処理
Toast.makeText(MainActivity.this, "Yesが押されました", Toast.LENGTH_LONG).show();
// 入力値をメインダイアログに書き戻す
EditText text1 = (EditText) MainActivity.this.findViewById(R.id.editText1);
text1.setText(editView.getText().toString());
}});
dlg.setNegativeButton("No", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
//Noボタンが押された時の処理
Toast.makeText(MainActivity.this, "Noが押されました", Toast.LENGTH_LONG).show();
}});
// AlertDialogを表示する
dlg.show();
}
テキスト入力2個のダイアログ

LinearLayoutによるコンテナを作成し、その中に必要なヴィジェットを全て詰め込む。その後、コンテナをAlertDialogにsetViewで紐付ける。
MainActivity.java
// AlertDialog上に作成するレイアウトコンテナ
final LinearLayout layout = new LinearLayout(MainActivity.this);
layout.setOrientation(LinearLayout.VERTICAL);
TextView text1 = new TextView(this);
text1.setText("日付の入力");
text1.setTextColor(Color.LTGRAY);
layout.addView(text1);
// 年月日入力のテキストボックス
final EditText editViewDate = new EditText(MainActivity.this);
editViewDate.setLines(1); // 1行
editViewDate.setInputType(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE);
SimpleDateFormat dateFmt = new SimpleDateFormat("yyyy/MM/dd");
Date dateNow = new Date();
editViewDate.setText(dateFmt.format(dateNow));
layout.addView(editViewDate);
TextView text2 = new TextView(this);
text2.setText("時間の入力");
text2.setTextColor(Color.LTGRAY);
layout.addView(text2);
// 時分入力のテキストボックス
final EditText editViewTime = new EditText(MainActivity.this);
editViewTime.setLines(1); // 1行
editViewTime.setInputType(InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME);
dateFmt.applyPattern("HH:mm");
editViewTime.setText(dateFmt.format(dateNow));
layout.addView(editViewTime);
// AlertDialogを構築する
AlertDialog.Builder dlg = new AlertDialog.Builder(this);
dlg.setTitle("テキスト入力2個のAlertDialog");
dlg.setMessage("日時を入力します");
dlg.setView(layout);
dlg.setPositiveButton("決定", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
//Yesボタンが押された時の処理(ここではログに出力している)
Log.d("EditViewDate", editViewDate.getText().toString());
Log.d("EditViewTime", editViewTime.getText().toString());
}});
dlg.setNegativeButton("キャンセル", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which) {
//Noボタンが押された時の処理
}});
// AlertDialogを表示する
dlg.show();
リスト選択のダイアログ

MainActivity.java
// リスト選択のAlertDialogを表示し、選択値をEditTextに設定する
private OnClickListener mButtonListDlgListener = new OnClickListener() {
public void onClick(View v) {
// 選択肢リストを作成する
final String[] items = new String[10];
for(int i=0; i<10; i++) {
items[i] = String.format("選択肢 %d", i);
}
// AlertDialogを構築する
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("リストのAlertDialog");
dlg.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int idx) {
Toast.makeText(MainActivity.this, String.format("%s が選択された", items[idx]), Toast.LENGTH_LONG).show();
// 入力値をメインダイアログに書き戻す
EditText text1 = (EditText) MainActivity.this.findViewById(R.id.editText1);
text1.setText(items[idx]);
}
});
dlg.setNegativeButton("キャンセル", null);
// AlertDialogを表示する
dlg.show();
}
};
リスト選択のダイアログ

MainActivity.java
// リスト選択のAlertDialogを表示し、選択値をEditTextに設定する
private OnClickListener mButtonListDlg2Listener = new OnClickListener() {
private int selectedItem = 1; // リストの選択値(onClickに対してグローバルで宣言する)
public void onClick(View v) {
// 選択肢リストを作成する
final String[] items = new String[10];
for(int i=0; i<10; i++) {
items[i] = String.format("選択肢 %d", i);
}
// AlertDialogを構築する
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("リストのAlertDialog");
dlg.setSingleChoiceItems(items, selectedItem, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int idx) {
selectedItem = idx;
}
});
dlg.setPositiveButton("OK", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int idx) {
//Yesボタンが押された時の処理
Toast.makeText(MainActivity.this, String.format("%s が選択された", items[selectedItem]), Toast.LENGTH_LONG).show();
// 入力値をメインダイアログに書き戻す
EditText text1 = (EditText) MainActivity.this.findViewById(R.id.editText1);
text1.setText(items[selectedItem]);
}});
dlg.setNegativeButton("キャンセル", null);
// AlertDialogを表示する
dlg.show();
}
};
リスト選択のダイアログ

MainActivity.java
// チェックボックスのリストを表示し、選択値を画面上のチェックボックスとプッシュボタンに反映する
private OnClickListener mButtonCheckboxDlgListener = new OnClickListener() {
private boolean[] checkedItems = {false, false}; // リストの選択値(onClickに対してグローバルで宣言する)
public void onClick(View v) {
final String[] items = {"チェックボックス", "トグルボタン"};
// 現在のチェック状態を読み出す
CheckBox checkBox = (CheckBox) MainActivity.this.findViewById(R.id.checkBox1);
if(checkBox.isChecked()){ checkedItems[0] = true; }
ToggleButton toggleButton = (ToggleButton) MainActivity.this.findViewById(R.id.toggleButton1);
if(toggleButton.isChecked()){ checkedItems[1] = true; }
// AlertDialogを構築する
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("チェックボックスのAlertDialog");
dlg.setMultiChoiceItems(items, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int idx, boolean isChecked) {
checkedItems[idx] = isChecked;
Toast.makeText(MainActivity.this, String.format("idx=%d, sel=%b", idx, isChecked), Toast.LENGTH_LONG).show();
}
});
dlg.setPositiveButton("OK", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int idx) {
//Yesボタンが押された時の処理
// 入力値をメインダイアログに書き戻す
CheckBox checkBox = (CheckBox) MainActivity.this.findViewById(R.id.checkBox1);
checkBox.setChecked(checkedItems[0]);
ToggleButton toggleButton = (ToggleButton) MainActivity.this.findViewById(R.id.toggleButton1);
toggleButton.setChecked(checkedItems[1]);
}});
dlg.setNegativeButton("キャンセル", null);
// AlertDialogを表示する
dlg.show();
}
};
XMLを用いずに、onCreat内で全てのwidgetを定義する方法
ソースコードの先頭付近の部分の抜粋。レイアウトを配置し、そこに各widgetを配置していく。
MainActivity.java
〜 プログラム先頭のimport列挙部分は省略 〜
import android.view.ViewGroup.LayoutParams;
public class MainActivity extends ActionBarActivity {
// イベントリスナ関数内で参照する必要のあるwidget
private EditText text1;
private CheckBox checkBox;
private ToggleButton toggleButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout);
text1 = new EditText(this);
text1.setText("文字列の初期値");
layout.addView(text1);
checkBox = new CheckBox(this);
checkBox.setText("CheckBox");
layout.addView(checkBox);
toggleButton = new ToggleButton(this);
// 幅を最大化せずに追加する
layout.addView(toggleButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Button buttonOkDlg = new Button(this);
buttonOkDlg.setText("OK AlertDialog");
layout.addView(buttonOkDlg);
buttonOkDlg.setOnClickListener(mButtonOkDlgListener);
}
〜 この後は省略 〜