2011年11月8日火曜日

Spinner (静的に生成する)

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

前回は動的に生成しましたが、選択肢が固定である場合にはJavaで動的に生成するより、xmlで記述して静的に作成したほうが効率的です。


Spinnerを使う

機能としては前回と同じ内容です。

文字列はstrings.xmlに定数として記述します。文字定数はIDが割り当てられます。JavaからはそのIDを元に文字列を取得して、Adapterにセットします。文字列をstrings.xmlに記述するのは、Adapterに限った話ではありません。

以下のサンプルでは、すべての文字列をxmlに記述するようにしてみました。この手法は、アプリを日本だけでなく海外向けにリリースする際に有用です。多言語対応の具体的な例はまた別の機会に譲るとしましょう。

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

SpinnerTest1bActivity.java
package jp.co.triware.samples.SpinnerTest1b;

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 SpinnerTest1bActivity extends Activity {

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

        // 都道府県
        ArrayAdapter<CharSequence> adptPrefs = ArrayAdapter.createFromResource(this, R.array.array_prefs, android.R.layout.simple_spinner_item);
        adptPrefs.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        Spinner spinPrefs = (Spinner)findViewById(R.id.prefs_spin);
        spinPrefs.setAdapter(adptPrefs);
        final int num = adptPrefs.getCount();
        final String defaultPref = getString(R.string.text_pref_default);
        for (int i = 0; i < num; i ++) {
            if (adptPrefs.getItem(i).equals(defaultPref) == true) {
                spinPrefs.setSelection(i); // 選択初期設定
                break;
            }
        }
        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<CharSequence> adptPrefs2 = ArrayAdapter.createFromResource(this, R.array.array_prefs2, android.R.layout.simple_spinner_item);
        adptPrefs2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        adptPrefs2.sort(null); // ソート
        Spinner spinPrefs2 = (Spinner)findViewById(R.id.prefs2_spin);
        spinPrefs2.setAdapter(adptPrefs2);
        spinPrefs2.setPromptId(R.string.text_prefs2_title); // タイトル
        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) {
            }
        });
    }
}

文字定数に割り当てられたIDは、R.string.***です。

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="@string/text_prefs"
            />
        <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="@string/text_prefs2"
            />
        <Spinner
            android:id="@+id/prefs2_spin"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            />
    </LinearLayout>
</LinearLayout>

strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">SpinnerTest1b</string>

    <string name="text_prefs">都道府県 : </string>
    <string-array name="array_prefs">
        <item>北海道</item>
        <item>青森県</item>
        <item>岩手県</item>
        <item>宮城県</item>
        <item>秋田県</item>
        <item>山形県</item>
        <item>福島県</item>
        <item>茨城県</item>
        <item>栃木県</item>
        <item>群馬県</item>
        <item>埼玉県</item>
        <item>千葉県</item>
        <item>東京都</item>
        <item>神奈川県</item>
        <item>新潟県</item>
        <item>富山県</item>
        <item>石川県</item>
        <item>福井県</item>
        <item>山梨県</item>
        <item>長野県</item>
        <item>岐阜県</item>
        <item>静岡県</item>
        <item>愛知県</item>
        <item>三重県</item>
        <item>滋賀県</item>
        <item>京都府</item>
        <item>大阪府</item>
        <item>兵庫県</item>
        <item>奈良県</item>
        <item>和歌山県</item>
        <item>鳥取県</item>
        <item>島根県</item>
        <item>岡山県</item>
        <item>広島県</item>
        <item>山口県</item>
        <item>徳島県</item>
        <item>香川県</item>
        <item>愛媛県</item>
        <item>高知県</item>
        <item>福岡県</item>
        <item>佐賀県</item>
        <item>長崎県</item>
        <item>熊本県</item>
        <item>大分県</item>
        <item>宮崎県</item>
        <item>鹿児島県</item>
        <item>沖縄県</item>
    </string-array>
    <string name="text_pref_default">大阪府</string>

    <string name="text_prefs2">Prefectures : </string>
    <string name="text_prefs2_title">Please choose a prefecture</string>
    <string-array name="array_prefs2">
        <item>Hokkaido</item>
        <item>Aomori</item>
        <item>Iwate</item>
        <item>Miyagi</item>
        <item>Akita</item>
        <item>Yamagata</item>
        <item>Fukushima</item>
        <item>Ibaraki</item>
        <item>Tochigi</item>
        <item>Gumma</item>
        <item>Saitama</item>
        <item>Chiba</item>
        <item>Tokyo</item>
        <item>Kanagawa</item>
        <item>Niigata</item>
        <item>Toyama</item>
        <item>Ishikawa</item>
        <item>Fukui</item>
        <item>Yamanashi</item>
        <item>Nagano</item>
        <item>Gifu</item>
        <item>Shizuoka</item>
        <item>Aichi</item>
        <item>Mie</item>
        <item>Shiga</item>
        <item>Kyoto</item>
        <item>Osaka</item>
        <item>Hyogo</item>
        <item>Nara</item>
        <item>Wakayama</item>
        <item>Tottori</item>
        <item>Shimane</item>
        <item>Okayama</item>
        <item>Hiroshima</item>
        <item>Yamaguchi</item>
        <item>Tokushima</item>
        <item>Kagawa</item>
        <item>Ehime</item>
        <item>Kochi</item>
        <item>Fukuoka</item>
        <item>Saga</item>
        <item>Nagasaki</item>
        <item>Kumamoto</item>
        <item>Oita</item>
        <item>Miyazaki</item>
        <item>Kagochima</item>
        <item>Okinawa</item>
    </string-array>
</resources>

文字列は<string>、文字列の配列は<string-array><item>で記述します。

実行結果



0 件のコメント:

コメントを投稿