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 件のコメント:
コメントを投稿