本日、実際にAndroidアプリ「魚かな、野菜かな」に反映を行ったスピナーの文字サイズを変更する方法についてまとめました。
本対応の目的
Androidの標準部品でスピナーを実装すると、文字サイズが固定されてxml上でtextSize等を指定しても反映されません。
本対応を行うことで、下記のようにスピナー未選択時の文字もドロップダウンで表示される文字も意図したサイズを指定することが出来るようになります。
layoutの準備
メインのレイアウトファイル。特に変わった点はありません。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <Spinner android:id="@+id/spinner" android:layout_width="match_parent" android:layout_height="wrap_content" /> </RelativeLayout>
スピナー用のレイアウトファイル。スピナーのテキストサイズ等を指定します。
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" style="?android:attr/spinnerItemStyle" android:singleLine="true" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="@dimen/sp_m" android:ellipsize="marquee" />
スピナーのドロップダウン用レイアウトファイル。ドロップダウンのテキストサイズ等を指定します。
<?xml version="1.0" encoding="utf-8"?> <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/dp_m" android:textSize="@dimen/sp_m" />
valuesの準備
文言用ファイル。スピナー内に表示する文字列をarray形式で保持しておきます。
<resources> <string name="app_name">Sample</string> <string-array name="spinner_list"> <item>選択肢1</item> <item>選択肢2</item> <item>選択肢3</item> </string-array> </resources>
dimen用ファイル。文字サイズ、余白サイズをまとめて指定します。
<resources> <!-- Default screen margins, per the Android Design guidelines. --> <dimen name="activity_horizontal_margin">16dp</dimen> <dimen name="activity_vertical_margin">16dp</dimen> <!-- 文字サイズ(小) --> <dimen name="sp_s">20sp</dimen> <!-- 文字サイズ(中) --> <dimen name="sp_m">30sp</dimen> <!-- 文字サイズ(大) --> <dimen name="sp_l">40sp</dimen> <!-- 余白などのサイズ(小) --> <dimen name="dp_s">4dp</dimen> <!-- 余白などのサイズ(中) --> <dimen name="dp_m">8dp</dimen> <!-- 余白などのサイズ(大) --> <dimen name="dp_l">16dp</dimen> </resources>
Java側の記載
ここまで準備できたら後はJava側で下記のように指定すればOKです。
package jp.co.skys.android.sample; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; public class spinnerSample extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //ポイント①「android.R.layout.simple_spinner_item」ではなく、自作のレイアウト「spinner_item.xml」を指定する //これによりスピナー内のtextSize等を個別に設定できるようになる。 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner_item,getResources().getStringArray(R.array.spinner_list)); //ポイント②「android.R.layout.simple_spinner_dropdown_item」ではなく、自作のレイアウト「spinner_dropdown_item.xml」を指定する //これによりスピナーを選択した際のドロップダウンリストのtextSize等を個別に設定出来るようになる。 adapter.setDropDownViewResource(R.layout.spinner_dropdown_item); Spinner spinner = (Spinner) findViewById(R.id.spinner); spinner.setAdapter(adapter); // スピナーのアイテムが選択された時の動作を設定 spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { //スピナー内のアイテムが選択された場合の処理をここに記載 } @Override public void onNothingSelected(AdapterView<?> arg0) { //スピナーでは呼ばれない模様。ただし消せないので「おまじない」として残す。 } }); } }
おまけ
上記一式含まれるファイルを下記よりダウンロードできます。
spinnerSample.zip
以上、ご参考まで