カテゴリー「android」の1件の記事

【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);