2014年4月2日水曜日

Android Spinnerの選択肢をXMLで指定する

Spinnerでは、Adapterを用意しなくてもXMLから選択肢をセットすることができます。

res/values/arrays.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="spinner_values"> <item>Cupcake</item> <item>Donut</item> <item>Eclair</item> <item>Froyo</item> <item>Gingerbread</item> <item>Honeycomb</item> <item>ICS</item> <item>JellyBean</item> <item>KitKat</item> </string-array> </resources> res/layout/activity_main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Spinner android:id="@+id/spinner1" android:layout_width="match_parent" android:layout_height="wrap_content" android:entries="@array/spinner_values" /> </LinearLayout> このandroid:entries属性はAbsSpinnerで用意されています。

このように選択肢をセットした場合、Spinner部分のレイアウトには android.R.layout.simple_spinner_item が、ドロップダウンのレイアウトには android.R.layout.simple_spinner_dropdown_item が使われます。

AbsSpinner.java 67 public AbsSpinner(Context context, AttributeSet attrs, int defStyle) { 68 super(context, attrs, defStyle); 69 initAbsSpinner(); 70 71 TypedArray a = context.obtainStyledAttributes(attrs, 72 com.android.internal.R.styleable.AbsSpinner, defStyle, 0); 73 74 CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries); 75 if (entries != null) { 76 ArrayAdapter adapter = 77 new ArrayAdapter(context, 78 R.layout.simple_spinner_item, entries); 79 adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item); 80 setAdapter(adapter); 81 } 82 83 a.recycle(); 84 }

android.R.layout.simple_spinner_item <?xml version="1.0" encoding="utf-8"?> ... <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" style="?android:attr/spinnerItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:textAlignment="inherit"/>

android.R.layout.simple_spinner_dropdown_item <?xml version="1.0" encoding="utf-8"?> ... <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" style="?android:attr/spinnerDropDownItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="?android:attr/dropdownListPreferredItemHeight" android:ellipsize="marquee" android:textAlignment="inherit"/> このレイアウトを見るとわかりますが、それぞれandroid:spinnerItemStyleとandroid:spinnerDropDownItemStyleに指定されているスタイルを適用しています。
この属性に独自のスタイルをセットすれば、Spinner部分とドロップダウンの文字サイズや文字色を一括で変えることができます。
文字サイズを小さくする例

res/values/styles.xml <resources> <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <item name="android:spinnerItemStyle">@style/SpinnerItemStyle</item> <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItemStyle</item> </style> <style name="SpinnerItemStyle" parent="android:Widget.Holo.Light.TextView.SpinnerItem"> <item name="android:textSize">12sp</item> </style> <style name="SpinnerDropDownItemStyle" parent="android:Widget.Holo.Light.DropDownItem"> <item name="android:textSize">12sp</item> </style> </resources>



この方法のときも、setOnItemSelectedListener()を使って選択項目が変わったことを検知でき、Adapterが保持しているObjectはStringになります。 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Spinner spinner = (Spinner) findViewById(R.id.spinner1); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> adapter, View v, int position, long id) { Toast.makeText(MainActivity.this, (String) adapter.getItemAtPosition(position), Toast.LENGTH_SHORT).show(); } @Override public void onNothingSelected(AdapterView<?> adapter) { } }); } }

0 件のコメント:

コメントを投稿