2011年11月4日金曜日

Spinner

今回は選択肢をポップアップしてその中からひとつ選ぶ方法を紹介します。

SpinnerはAdapterと組み合わせて使います。Adapterに選択肢のデータをセットして、AdapterをSpinnerにセットします。

都道府県をSpinnerで選択して、選択した都道府県名をToastで表示するサンプルを作ります。


Spinnerを使う

Androidプロジェクトの設定
プロジェクト名:SpinnerTest1a
ビルドターゲット:Android 2.1-update1
アプリケーション名:SpinnerTest1a
パッケージ名:jp.co.triware.samples.SpinnerTest1a
アクティビティーの作成:SpinnerTest1aActivity
最小SDKバージョン:7

SpinnerTest1aActivity.java
package jp.co.triware.samples.SpinnerTest1a;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class SpinnerTest1aActivity extends Activity {

    private static final String[] strPrefs = {
        // 北海道地方
        "北海道",
        // 東北地方
        "青森県",   "岩手県",   "宮城県",   "秋田県",   "山形県",   "福島県",
        // 関東地方
        "茨城県",   "栃木県",   "群馬県",   "埼玉県",   "千葉県",   "東京都",   "神奈川県",
        // 中部地方
        "新潟県",   "富山県",   "石川県",   "福井県",   "山梨県",   "長野県",   "岐阜県",   "静岡県",   "愛知県",
        // 近畿地方
        "三重県",   "滋賀県",   "京都府",   "大阪府",   "兵庫県",   "奈良県",   "和歌山県",
        // 中国地方
        "鳥取県",   "島根県",   "岡山県",   "広島県",   "山口県",
        // 四国地方
        "徳島県",   "香川県",   "愛媛県",   "高知県",
        // 九州地方
        "福岡県",   "佐賀県",   "長崎県",   "熊本県",   "大分県",   "宮崎県",   "鹿児島県",
        // 沖縄地方
        "沖縄県",
    };
    private static final String[] strPrefs2 = {
        // 北海道地方
        "Hokkaido",
        // 東北地方
        "Aomori",   "Iwate",    "Miyagi",   "Akita",    "Yamagata", "Fukushima",
        // 関東地方
        "Ibaraki",  "Tochigi",  "Gumma",    "Saitama",  "Chiba",    "Tokyo",    "Kanagawa",
        // 中部地方
        "Niigata",  "Toyama",   "Ishikawa", "Fukui",    "Yamanashi",    "Nagano",   "Gifu", "Shizuoka", "Aichi",
        // 近畿地方
        "Mie",  "Shiga",    "Kyoto",    "Osaka",    "Hyogo",    "Nara", "Wakayama",
        // 中国地方
        "Tottori",  "Shimane",  "Okayama",  "Hiroshima",    "Yamaguchi",
        // 四国地方
        "Tokushima",    "Kagawa",   "Ehime",    "Kochi",
        // 九州地方
        "Fukuoka",  "Saga", "Nagasaki", "Kumamoto", "Oita", "Miyazaki", "Kagochima",
        // 沖縄地方
        "Okinawa",
    };
    private static final int defaultPref = 26; // 大阪府

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // 都道府県
        ArrayAdapter<String> adptPrefs = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        adptPrefs.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        for (int i = 0; i < strPrefs.length; i ++) {
            adptPrefs.add(strPrefs[i]);
        }
        Spinner spinPrefs = (Spinner)findViewById(R.id.prefs_spin);
        spinPrefs.setAdapter(adptPrefs);
        spinPrefs.setSelection(defaultPref); // 選択初期設定
        spinPrefs.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Spinner spinParent = (Spinner)parent;
                String myItem = (String)spinParent.getSelectedItem();
                int myPosition = spinParent.getSelectedItemPosition();
                Toast.makeText(getApplicationContext(),
                        "item=[" + myItem + "]\nposition=" + myPosition + " (" + position + ")",
                        Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

        // Prefectures
        ArrayAdapter<String> adptPrefs2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
        adptPrefs2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        for (int i = 0; i < strPrefs2.length; i ++) {
            adptPrefs2.add(strPrefs2[i]);
        }
        adptPrefs2.sort(null); // ソート
        Spinner spinPrefs2 = (Spinner)findViewById(R.id.prefs2_spin);
        spinPrefs2.setAdapter(adptPrefs2);
        spinPrefs2.setPrompt("Please choose a prefecture"); // タイトル
        spinPrefs2.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Spinner spinParent = (Spinner)parent;
                String myItem = (String)spinParent.getSelectedItem();
                int myPosition = spinParent.getSelectedItemPosition();
                Toast.makeText(getApplicationContext(),
                        "item=[" + myItem + "]\nposition=" + myPosition + " (" + position + ")",
                        Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }
}

漢字表記の初期状態は「大阪府」を選択しています。
ローマ字表記はアルファベット順に並べ替えています。また選択肢を表示する際にプロンプトを指定し、タイトルを表示するようにしています。

SpinnerのsetSelection()で指定したインデックスの項目が選択された状態になります。指定しなければ先頭が選択されます。
Adapterのsort()を使うことで、選択肢のデータを並べ替えることもできます。

onItemSelected()の引数parentがSpinnerに相当しますので、それを元にgetSelectedItem()で選択された項目の文字列を取得できます。getSelectedItemPosition()を使うと、一覧の何番目なのか、位置(インデックス)を取得することができます。なお、引数positionも位置を表しています。

main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="都道府県 : "
            />
        <Spinner
            android:id="@+id/prefs_spin"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />
    </LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Prefectures : "
            />
        <Spinner
            android:id="@+id/prefs2_spin"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />
    </LinearLayout>
</LinearLayout>

実行結果


Spinner生成時にonSelectedItems()が呼び出されますので、起動時にToastを表示します。


この状態から「都道府県」のSpinnerをクリックすると・・・

「大阪府」を選択した状態で一覧が表示されます。

「兵庫県」を選ぶと・・・
無事、「兵庫県」が反映されました。

同様に「Prefectures」も試してみましょう。
こちらはプロンプトを設定していますので、「都道府県」の一覧と違ってタイトルが表示されています。

0 件のコメント:

コメントを投稿