表題の通り。
静的な文字列リソースはxmlで定義しますよね。
親の配列をまずスピナーで表示させて、選択されたらその選択に応じて子スピナーの配列を動的に制御したいなと思ったんですよ。
ただR.javaは全部数値で管理されてるので、文字列云々を使えない。
これはよろしくないということでちょっとサンプルを作ってみました。
strings.xml
親のスピナーで選ぶ item の名前と同じ string-array で子スピナーにしたい string-array を作る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Spinner_array_by_array</string> <!-- 親スピナー --> <string-array name="parent"> <item>child1</item> <item>child2</item> <item>child3</item> </string-array> <!-- 親のitemと同じ名前を付けた子スピナー用の string-array 3つ --> <string-array name="child1"> <item>item_child1</item> <item>item_child1</item> <item>item_child1</item> </string-array> <string-array name="child2"> <item>item_child2</item> <item>item_child2</item> <item>item_child2</item> </string-array> <string-array name="child3"> <item>item_child3</item> <item>item_child3</item> <item>item_child3</item> </string-array> </resources> |
Spinnerをレイアウト
layout ファイルにスピナーを2つ作る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?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" android:padding="20dip"> <!-- 親スピナー。android:entriesで親スピナー用のstring-arrayを指定 --> <Spinner android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/spinner_parent" android:layout_gravity="center" android:entries="@array/parent" /> <!-- 子スピナー。string-arrayはjavaで動的に入れる。 --> <Spinner android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/spinner_child" android:layout_gravity="center" /> </LinearLayout> |
Activityで実装
ここが本題。
選択したアイテム文字列でそのままリソース指定はできない( R.array. + “String” みたいに)ので、getIdentifier() を使っていったんリソースIDとして string-array を取得。
そのリソースIDを配列にしてアダプタに入れ、スピナーに渡してみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | package com.example.Spinner_array_by_array; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; public class MyActivity extends Activity { private static Spinner mSpinner; private static String mSelect; private static String[] mArray; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); /* * スピナーを動的に変える */ // 親スピナー取得 mSpinner = (Spinner) findViewById(R.id.spinner_parent); // スピナー選択時の処理 mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 親スピナーの選択したアイテム文字列を取得 mSelect = parent.getSelectedItem().toString(); // 取得した文字列から配列リソースIDを取得 int rID = getResources().getIdentifier(mSelect, "array", getPackageName()); // 取得した配列リソースIDを文字列配列に格納 mArray = getResources().getStringArray(rID); // 子スピナー取得 mSpinner = (Spinner) findViewById(R.id.spinner_child); // 配列リソースIDから取得した文字列配列をアダプタに入れる ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_spinner_item); for (int i = 0; i < mArray.length; i++) { mAdapter.add(mArray[i]); } mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // アダプタを子スピナーにセット mSpinner.setAdapter(mAdapter); } // 何も選択されてない場合 public void onNothingSelected(AdapterView<?> parent) { } }); } } |
こんな感じで動作します。




日本語のリソースはこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">Spinner_array_by_array</string> <!-- 親スピナー --> <string-array name="parent"> <item>子スピナー1</item> <item>子スピナー2</item> <item>子スピナー3</item> </string-array> <!-- 子 --> <string-array name="子スピナー1"> <item>子スピナーアイテム1</item> <item>子スピナーアイテム1</item> <item>子スピナーアイテム1</item> </string-array> <string-array name="子スピナー2"> <item>子スピナーアイテム2</item> <item>子スピナーアイテム2</item> <item>子スピナーアイテム2</item> </string-array> <string-array name="子スピナー3"> <item>子スピナーアイテム3</item> <item>子スピナーアイテム3</item> <item>子スピナーアイテム3</item> </string-array> </resources> |
さいごに
string-arrayじゃなくてもdrawableであろうがxmlで作った配列を好き放題動的に取得できますね、これを使いこなせば素敵になれそう。
もっといいやり方があったら教えてくださーい。
写真だとわかりづらいので、興味ある方はサンプルアプリ置いときますのでどうぞ。