2014年4月2日水曜日

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

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

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

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

AbsSpinner.java
  1.      67     public AbsSpinner(Context context, AttributeSet attrs, int defStyle) {  
  2.      68         super(context, attrs, defStyle);  
  3.      69         initAbsSpinner();  
  4.      70   
  5.      71         TypedArray a = context.obtainStyledAttributes(attrs,  
  6.      72                 com.android.internal.R.styleable.AbsSpinner, defStyle, 0);  
  7.      73   
  8.      74         CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries);  
  9.      75         if (entries != null) {  
  10.      76             ArrayAdapter<charsequence> adapter =  
  11.      77                     new ArrayAdapter<charsequence>(context,  
  12.      78                             R.layout.simple_spinner_item, entries);  
  13.      79             adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item);  
  14.      80             setAdapter(adapter);  
  15.      81         }  
  16.      82   
  17.      83         a.recycle();  
  18.      84     }  
  19. </charsequence></charsequence>  


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


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

res/values/styles.xml
  1. <resources>  
  2.   
  3.     <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">  
  4.         <item name="android:spinnerItemStyle">@style/SpinnerItemStyle</item>  
  5.         <item name="android:spinnerDropDownItemStyle">@style/SpinnerDropDownItemStyle</item>  
  6.     </style>  
  7.       
  8.     <style name="SpinnerItemStyle" parent="android:Widget.Holo.Light.TextView.SpinnerItem">  
  9.         <item name="android:textSize">12sp</item>  
  10.     </style>  
  11.       
  12.     <style name="SpinnerDropDownItemStyle" parent="android:Widget.Holo.Light.DropDownItem">  
  13.         <item name="android:textSize">12sp</item>  
  14.     </style>  
  15.   
  16. </resources>  




この方法のときも、setOnItemSelectedListener()を使って選択項目が変わったことを検知でき、Adapterが保持しているObjectはStringになります。
  1. public class MainActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.   
  8.         Spinner spinner = (Spinner) findViewById(R.id.spinner1);  
  9.         spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {  
  10.   
  11.             @Override  
  12.             public void onItemSelected(AdapterView<?> adapter,   
  13.                 View v, int position, long id) {  
  14.   
  15.                 Toast.makeText(MainActivity.this,   
  16.                     (String) adapter.getItemAtPosition(position),   
  17.                     Toast.LENGTH_SHORT).show();  
  18.             }  
  19.   
  20.             @Override  
  21.             public void onNothingSelected(AdapterView<?> adapter) {  
  22.             }  
  23.         });  
  24.     }  
  25. }  

0 件のコメント:

コメントを投稿