概要
デフォルトフォントを適応するときのアプローチのまとめと、自作のライブラリの紹介です。
DroidKaigiの資料で触れていますが、Qiitaにまとめておきます。
https://speakerdeck.com/takahirom/support-libraryfalsedownloadable-fontsyaemojicompatnidui-ying-sitaapuriwozuo-rou
デフォルトフォントの適応方法について
以下5つぐらいの方法が存在します。
- 手動で指定する方法
- テーマによる方法
- リフレクションによる方法 StackOverFlow
- chrisjenx/Calligraphyによる方法
- 激推し → takahirom/DownloadableCalligraphyによる方法
手動で指定する方法
デフォルトのフォントを指定せずに手動で指定していく方法です。これでほとんど問題ないです。ただToolbarのタイトルやBottomNavigation、TabLayoutなどを自分でちゃんと属性を調べて、大きさなども調べ、自分で指定していく必要があります、ただ頑張って指定していけばなんとかなります。
DroidKaigi公式アプリではマテリアルデザインのDense scriptの記載に則って、指定していっています。
<TextView
android:id="@+id/speaker_name"
android:textAppearance="@style/TextAppearance.App.Body1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
(DroidKaigiアプリより)
<style name=“TextAppearance.App.Title"
parent="TextAppearance.AppCompat.Title">
<item name="android:textSize">21sp</item>
<item name="android:fontFamily">@font/notosans_medium</item>
</style>
<style name="TextAppearance.App.Subhead"
parent="TextAppearance.AppCompat.Subhead">
<item name="android:textSize">17sp</item>
<item name="android:fontFamily">@font/notosans_regular</item>
</style>
テーマによる方法
TextViewだけであればtextViewStyleを使ったり、以下のように全てのtextAppearanceを指定していくことで、大体設定することが出来ます。しかし、デフォルトの大きさの指定を調べたりする手間や、テーマファイルは汚れますし、なかなか保守が大変になります。
<style name=“AppTheme" parent="Theme.AppCompat.Light">
<item name=“android:textAppearance">@style/TextAppearance.hogehoge</item>
<item name=“android:textAppearanceSmall”>@style/TextAppearance..</item>
<item name="android:textAppearanceButton">@style/TextAppearance…</item>
<item name=“android:textAppearanceMediumInverse”>@style/TextAppearance…</item>
。。。。
リフレクションによる方法 StackOverFlow
これはAppCompatThemeでは動きません。一般的なアプリでは利用できないものとなります。
chrisjenx/Calligraphyによる方法
デフォルトフォントを指定したい場合、今のデファクトスタンダードなライブラリはchrisjenx/Calligraphyだと思われます。
去年、Font Resource、Downloadable Fontの発表されました。その時にCalligraphy is deadと作者が言っていて、CalligraphyはFont Resourceの仕組みが適応できず、またツイート前の5/16日が最終コミットで開発が止まっています。
takahirom/DownloadableCalligraphyによる方法
そこで自分がライブラリを作りました。
CalligraphyをベースにFont Resourceの仕組みを適応したのがこのライブラリになります。
これはDroidKaigiアプリの初期に導入して利用しており、うまく動いています。
DownloadableCalligraphyという名前ですが、Font Resourceを指定できるので、アプリにフォントを埋め込むBundled Resourceも普通に指定できます。
みなさんがスターしていただけると、前例が増えて、安心して使えるようになるのではと思います。
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFont(R.font.roboto_regular)
.build());
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
まとめ
他に選択肢があれば教えてください。なければtakahirom/DownloadableCalligraphyにスターをつけてください。