goo blog サービス終了のお知らせ 

marunomaruno-memo

marunomaruno-memo

Android ダイアログ(2) リスト選択、ラジオボタン、チェックボックス

2011年07月10日 | Android
ダイアログ(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 要素



最新の画像もっと見る

コメントを投稿