最近在进行开发的时候,碰到了一个比较少见的需求,需要在切换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中查看。
设置字体前:
设置字体后: