前回は動的に生成しましたが、選択肢が固定である場合には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 件のコメント:
コメントを投稿