Android批量设置字体框架Calligraphy

时间:2023-02-01 19:25:36

最近在进行开发的时候,碰到了一个比较少见的需求,需要在切换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()
            );
    //....
}


之后在我们需要修改的Activity中,重写attachBaseContext方法,此处建议创建一个父类Activity

@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中查看。

设置字体前:

Android批量设置字体框架CalligraphyAndroid批量设置字体框架Calligraphy

设置字体后:

Android批量设置字体框架CalligraphyAndroid批量设置字体框架Calligraphy