ダイアログ(2) リスト選択、ラジオボタン、チェックボックス ==================================================================== リスト選択、ラジオボタン、チェックボックスのいずれも AlertDialog を使う。 ただし、項目を設定するメソッドが、それぞれ以下のメソッドを使う。 リスト選択 setItems() ラジオボタン setSingleChoiceItems() チェックボックス setMultiChoiceItems() 上記の3つを一度に指定するプログラムを下に示す。 ただし、3つ同時に扱っているので、なにも選択せずにOKボタンをクリックすると動作が おかしくなる。 ここでは、このプログラムの詳細については触れない。個別の箇所を参照されたい。 □ Dialog03Activity.java --- package jp.marunomaruno.android.sample; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnMultiChoiceClickListener; import android.os.Bundle; import android.widget.Toast; public class Dialog03Activity extends Activity { public static final String[] PETS = { "犬", "猫", "いたち", "わに", "鳥" }; // (1) private boolean[] choiced = { true, false, false, false, false }; // (2) private static final int DEFAULT_INDEX = 0; // (3) private String choicedItemString = ""; // (4) /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // チェックボックス new AlertDialog.Builder(this) .setTitle("複数選択できます。") .setMultiChoiceItems(PETS, choiced, new MultiChoiceItemsHandler()) // (5) .setPositiveButton("OK", new OkButtonHandler()) .show(); // ラジオボタン new AlertDialog.Builder(this) .setTitle("選択してください。") .setSingleChoiceItems(PETS, DEFAULT_INDEX, new ChoiceItemHandler()) // (6) .setPositiveButton("OK", new OkButtonHandler()) .show(); // 選択リスト new AlertDialog.Builder(this) .setTitle("選択してください。") .setItems(PETS, new ChoiceItemHandler()) // (7) // .setPositiveButton("OK", new OkButtonHandler()) // 意味なし .show(); } /** * 指定されたメッセージをToastで表示する。 * @param message メッセージ */ private void showToast(String message) { Toast.makeText(Dialog03Activity.this, message, Toast.LENGTH_SHORT).show (); } /** * リストの項目と、それに対応する選択されたかどうかを示す配列から、 * 選択された項目を文字列化する。 * @param items 項目のリスト * @param choiced 選択配列 * @return 選択項目の文字列 */ private String toChoicedItemsString(String[] items, boolean[] choiced) { List<String> list = new ArrayList<String>(); for (int i = 0; i < items.length; i++) { if (choiced[i]) { list.add(items[i]); } } return list.toString(); } /** * 項目がクリックされたときのハンドラー */ private class ChoiceItemHandler implements OnClickListener { // (8) @Override public void onClick(DialogInterface dialog, int which) { choicedItemString = PETS[which]; // (9) showToast(String.format("%s を選択しました", choicedItemString)); } } /** * 複数項目がクリックされたときのハンドラー */ private class MultiChoiceItemsHandler implements OnMultiChoiceClickListener { // (10) @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { choiced[which] = isChecked; // (11) showToast(String.format("%s を%sしました", PETS[which], (isChecked ? "選択" : "外"))); choicedItemString = toChoicedItemsString(PETS, choiced); } } /** * OKボタンがクリックされたときのハンドラー */ private class OkButtonHandler implements OnClickListener { @Override public void onClick(DialogInterface dialog, int which) { showToast(String.format("最終的に %s を選択しました", choicedItemString)); } } } --- (1) リストの項目をString配列で指定する (4) それぞれのハンドラーで選択された結果を文字列化して保持する ■ リスト選択 リストが表示され、そこからひとつを選択する。 選択されたら、処理は次に進む。 ソースの一部分 --- : public static final String[] PETS = { "犬", "猫", "いたち", "わに", "鳥" }; // (1) private String choicedItemString = ""; // (4) : // 選択リスト new AlertDialog.Builder(this) .setTitle("選択してください。") .setItems(PETS, new ChoiceItemHandler()) // (7) // .setPositiveButton("OK", new OkButtonHandler()) // 意味なし .show(); } : /** * 項目がクリックされたときのハンドラー */ private class ChoiceItemHandler implements OnClickListener { // (8) @Override public void onClick(DialogInterface dialog, int which) { choicedItemString = PETS[which]; // (9) showToast(String.format("%s を選択しました", choicedItemString)); } } : --- (7) 選択リストをつくるには、setItems()メソッドを使う。 AlertDialog.Builder setItems(int itemsId, DialogInterface.OnClickListener listener) AlertDialog.Builder setItems(CharSequence[] items, DialogInterface.OnClickListener listener) 例) setItems(PETS, new ChoiceItemHandler()) // (7) items 項目の文字列配列 PETS listener 複数選択に対応したリスナー・オブジェクト オーバーロードされているメソッドは、 itemsId 項目の文字列配列のリソースID (8) 項目がクリックされたときのハンドラー 内部クラスで作っている。ここで使うインターフェースは、 DialogInterface.OnClickListener。 これは、setPositiveButton()などで指定するOKやYesボタンに対するイベントリスナーと 同じである。 ただし、onClick() メソッドのwhichが、項目の配列の添字を示している。したがって、 setPositiveButton()などで指定するOKやYesボタンのように、負数となることはない。 (9) クリックされた項目を文字列化する onClick() メソッドの引数 which が、項目の配列の添字を示しているので、次の文でそ の添字に対する文字列を取得できる。 choicedItemString = PETS[which]; // (9) ※ AlertDialogで、setItems()メソッドを使った場合、項目が選択されたら、 setPositiveButton()でハンドラーを指定していてもそのボタンは無視されるみたい。 ■ ラジオボタン リストの中から、単一のものを指定する。setPositiveButton()メソッドを使うことで、 一度指定したものを変更することもできる。 ソースの一部分 --- : public static final String[] PETS = { "犬", "猫", "いたち", "わに", "鳥" }; // (1) private static final int DEFAULT_INDEX = 0; // (3) private String choicedItemString = ""; // (4) : // ラジオボタン new AlertDialog.Builder(this) .setTitle("選択してください。") .setSingleChoiceItems(PETS, DEFAULT_INDEX, new ChoiceItemHandler()) // (6) .setPositiveButton("OK", new OkButtonHandler()) .show(); : --- (3) ラジオボタンで、最初からチェックがついている項目の添字。 -1 を指定すると、どの項目もチェックがつかない。 (6) ラジオボタンをつくるには、setSingleChoiceItems()メソッドを使う。 AlertDialog.Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, DialogInterface.OnClickListener listener) AlertDialog.Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, DialogInterface.OnClickListener listener) AlertDialog.Builder setSingleChoiceItems(int itemsId, int checkedItem, DialogInterface.OnClickListener listener) AlertDialog.Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn, DialogInterface.OnClickListener listener) 例) setSingleChoiceItems(PETS, DEFAULT_INDEX, new ChoiceItemHandler()) // (6) items 項目の文字列配列 PETS checkedItems 最初に選択されている項目の添字 listener 複数選択に対応したリスナー・オブジェクト オーバーロードされているメソッドの引数 itemsId 項目の文字列配列のリソースID cursor データベースの結果セットのカーソルのオブジェクト labelColumn 列名 adapter 項目のリスト checkedItem 最初にチェックされている項目 ■ チェックボックス 複数選択できる項目。 ソースの一部分 --- : public static final String[] PETS = { "犬", "猫", "いたち", "わに", "鳥" }; // (1) private boolean[] choiced = { true, false, false, false, false }; // (2) private String choicedItemString = ""; // (4) : // チェックボックス new AlertDialog.Builder(this) .setTitle("複数選択できます。") .setMultiChoiceItems(PETS, choiced, new MultiChoiceItemsHandler()) // (5) .setPositiveButton("OK", new OkButtonHandler()) .show(); : /** * リストの項目と、それに対応する選択されたかどうかを示す配列から、選択され た項目を文字列化する。 * @param items 項目のリスト * @param choiced 選択配列 * @return 選択項目の文字列 */ private String toChoicedItemsString(String[] items, boolean[] choiced) { List<String> list = new ArrayList<String>(); for (int i = 0; i < items.length; i++) { if (choiced[i]) { list.add(items[i]); } } return list.toString(); } : /** * 複数項目がクリックされたときのハンドラー */ private class MultiChoiceItemsHandler implements OnMultiChoiceClickListener { // (10) @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { choiced[which] = isChecked; // (11) showToast(String.format("%s を%sしました", PETS[which], (isChecked ? "選択" : "外"))); choicedItemString = toChoicedItemsString(PETS, choiced); } } : --- (2) チェックがついている項目に対応するboolean型の配列。trueのものに対応する項目 は、チェックがついている。 (5) チェックボックスをつくるには、setMultiChoiceItems()メソッドを使う。 AlertDialog.Builder setMultiChoiceItems(CharSequence[] items, boolean[] chec kedItems, DialogInterface.OnMultiChoiceClickListener listener) AlertDialog.Builder setMultiChoiceItems(Cursor cursor, String isCheckedCo lumn, String labelColumn, DialogInterface.OnMultiChoiceClickListener listener) AlertDialog.Builder setMultiChoiceItems(int itemsId, boolean[] checkedIte ms, DialogInterface.OnMultiChoiceClickListener listener) 例) setMultiChoiceItems(PETS, choiced, new MultiChoiceItemsHandler()) // (5) items 項目の文字列配列 PETS checkedItems 項目が選択されているかどうかをあらわすboolean型の配列。 選択された状態ならtrue。 listener 複数選択に対応したリスナー・オブジェクト オーバーロードされているメソッドの引数 itemsId 項目の文字列配列のリソースID cursor データベースの結果セットのカーソルのオブジェクト isCheckedColumn 最初からチェックされている列 labelColumn 列名 (10)(11) DialogInterface.OnMultiChoiceClickListenerを実装したオブジェクト onClick() メソッドを実装する。 abstract void onClick(DialogInterface dialog, int which, boolean isChecked) which番目の添字の項目がクリックされたら、isChecked になる 最終的に、どの項目がチェックされたか、されていないかは、次の文で設定する。 choiced[which] = isChecked; // (11) ■ 国際化 res/values/strings.xml を使うことで、プログラム中では、R.string.リソースID で、 直接文字列を使う必要がなくなる。 選択リストなどの文字配列も同様に、res/values/strings.xml を使うことで、国際化を 実現する。 つぎのプロジェクトは、Dialog03 プロジェクトの選択リスト部分を国際化を意識して作 ったものである。 ※ ソースには、行コメント「//」がついている。場合によっては、XMLファイルにもこの 形式のコメントがついているが、XMLの場合は、「//」はコメントを意味しないので、こ の形式で記述するとエラーになるので注意 □ res/values/strings.xml --- <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, Dialog03Activity!</string> <string name="app_name">Dialog031</string> <string name="dialog_title">選択してください。</string> <string name="result_format">%s を選択しました。</string> <string-array name="pets"> // (1) <item>犬</item> // (2) <item>猫</item> <item>いたち</item> <item>わに</item> <item>鳥</item> </string-array> </resources> --- (1) 文字列の配列のリソースは、string-array 要素で指定する プログラム中では、R.array.名前 で、このリソースID を取得できる。例の場合は、 R.array.pets。 また、String配列オブジェクトは、getResources().getStringArray(R.array.名前) で取 得できる。 (2) 各要素は item 要素で指定する □ Dialog031Activity.java --- package jp.marunomaruno.android.sample; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.os.Bundle; import android.widget.Toast; public class Dialog031Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 選択リスト new AlertDialog.Builder(this) .setIcon(R.drawable.icon) // (1) .setTitle(R.string.dialog_title) // (2) .setItems(R.array.pets, new ChoiceItemHandler()) // (3) .show(); } /** * 指定されたメッセージをToastで表示する。 * @param message メッセージ */ private void showToast(String message) { Toast.makeText(Dialog031Activity.this, message, Toast.LENGTH_SHORT).show (); } /** * 項目がクリックされたときのハンドラー */ private class ChoiceItemHandler implements OnClickListener { @Override public void onClick(DialogInterface dialog, int which) { showToast(String.format(getString(R.string.result_format), getResources().getStringArray(R.array.pets)[which])); // (4) } } } --- (1) ダイアログに表示するアイコンをリソースIDで指定 (2) ダイアログのタイトルをリソースIDで指定 (3) ダイアログの項目の配列をリソースIDで指定 (4) 項目の配列を getResources().getStringArray(R.array.pets) メソッドで指定 □ res/values/strings.xml --- <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, Dialog03Activity!</string> <string name="app_name">Dialog031</string> <string name="dialog_title">選択してください。</string> <string name="result_format">%s を選択しました。</string> <string-array name="pets"> // (1) <item>犬</item> // (2) <item>猫</item> <item>いたち</item> <item>わに</item> <item>鳥</item> </string-array> </resources> --- (1) 文字列の配列を定義する開始タグ string-array タグ プログラム中では、「R.array.配列名」で、リソースIDを参照する。 また、Activityクラスの中で、String[] で取得するには、 getStringArray(リソースID) メソッドを使う。 (2) 配列の要素を定義する item 要素
最新の画像[もっと見る]
-
あけましておめでとうございます 11年前
-
今年もよろしくお願いいたします 12年前
-
あけましておめでとうございます 13年前
-
あけましておめでとうございます 16年前
※コメント投稿者のブログIDはブログ作成者のみに通知されます