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