【android備忘ログ】2018/12/21(金) 各種コントロールのフォント指定
androidアプリ開発において、EditTextやButtonなどのコントロールのデザイン設定はlayoutフォルダ配下にあるレイアウトファイルと呼ばれるxmlファイル内でandroid:キーワードによる属性指定で行います。
<Button
android:id="@+id/send_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:onClick="onClick"
android:text="@string/common_set"
android:textSize="8pt"
app:fontFamily="@font/abel" />
フォントを指定したい時も上記のように、レイアウトファイルに記述するのですが、一部のコントロールについてはこの指定では変わらず悩みました。
<Switch
android:id="@+id/switch_onoff"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_weight="1"
android:onClick="onClick"
android:text="@string/tab3_light_sw"
android:textColor="@color/colorPrimary"
android:textSize="20dp"
android:visibility="invisible"
app:fontFamily="@font/abel" />
レイアウトファイルで指定しても変化しないコントロールは入れ子構造になっていることが原因のようです。
例えばSpinnerの場合、文字列リストをbindするためのAdapterを生成し、getView、getDrapDownViewイベントをオーバーライドし、その中でviewの属性を書き換える事で対応しました。
private static class SCustomSpinnerAdapter extends ArrayAdapter<String> {
Typeface font = ResourcesCompat.getFont(getContext(), R.font.abel);
private MySpinnerAdapter(Context context, int resource, List<String> items) {
super(context, resource, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getView(position, convertView, parent);
view.setTypeface(font);
return view;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getDropDownView(position, convertView, parent);
view.setTypeface(font);
return view;
}
変更方法は以下の通り。
まず、フォントリソースを取得します。
予めフォントファイルをres/fontに配置しておきます。ttfファイルをただ配置するだけではだめで、Projectビューのresで右クリックしてNew → Android Resource Filesから、Resource typeをfont指定にして、ttfファイル名も入力して登録しておくことで、以下の構文が使えるようになります。
Typeface font = ResourcesCompat.getFont(getContext(), R.font.abel);
次に、Activityへ表示される方のボタン+選択文字列の表示をgetView()内で書換えます。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getView(position, convertView, parent);
view.setTypeface(font);
return view;
}
文字色やGravityなど他の属性もここで指定できます。
positionにより処理を分けることで、行ごとに表示の仕方を変えることもできます。
Activity上のSpinnerをタッチすると表示されるリストの設定は、getDropDownView()内で。
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView view = (TextView) super.getDropDownView(position, convertView, parent);
view.setTypeface(font);
return view;
}
次にこのAdapterを生成します。
Context context = getApplicationContext();
int resource = R.layout.support_simple_spinner_dropdown_item;
CustomSpinnerAdapter adapter = new CustomSpinnerAdapter(context, resource, Arrays.asList(getResources().getStringArray(R.array.array_list)));
最後にSpinnerオブジェクトにセットします。
Spinner spinner = (Spinner) findViewById(R.id.spinner_modes);
spinner.setAdapter(sp_adapter);
Switchコントロールは以下のように指定するだけで指定フォントが反映されました。
Typeface font = ResourcesCompat.getFont(getContext(), R.font.mplus_rounded1c_light);
Switch toggle = (Switch) findViewById(R.id.switch_timer);
toggle.setTypeface(typeface);