最近在進行開發的時候,碰到了一個比較少見的需求,需要在切換APP風格/皮膚的時候將字體也切換掉,一般來說在移動客戶端是很少涉及字體的,但是作爲一個比較重要的需求還是將它實現了出來。
在網上查找相關解決方案的時候,大概會分爲幾種方法
1、自定義一個textview,在裏面設置字體
2、遍歷rootview,找到裏面每一個textview,設置字體,但是隻能設置textview而無法設置其他如Button等控件
3、利用反射修改Typeface,代碼見Github,(這種方式有時間可以深入研究下)
但是感覺還是比較麻煩,後來在github中查到了一個開源項目Calligraphy,使用起來十分簡便,代碼見Github
首先,在gradle文件中配置依賴路徑
dependencies {
compile 'uk.co.chrisjenx:calligraphy:2.2.0'
}
然後在自定義的Application中的onCreate進行設置
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
//....
}
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
如果想設置某個TextView字體不同,可以直接在xml中設置fontpath
<TextView
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
fontPath="fonts/Roboto-Bold.ttf"/>
在設置path的時候,本來以爲由於兼容性的問題有可能會找不到assets中的文件,還自己做了處理,後來發現多慮了,直接寫assets中的名稱即可。
至此,完成了Android應用字體的批量設置,Calligraphy還有很多的功能,詳情可以在Github中查看。
設置字體前:
設置字體後: