网上找了很多关于android全局设置应用字体的文章,但是都很麻烦,并且都是你抄我,我抄你的。
最后找到一篇写的还算不错的文章。http://ryanhoo.github.io/blog/2014/05/05/android-better-way-to-apply-custom-font/
但是里面的设置也比较复杂,我想要的是一处设置,处处生效(在某一个程序范围内)。
最后终于放我找到一个方式可以说是一处设置,处处生效。
代码如下:
public static void applyAppFont(Context context,String fontName) {
try {
final Field staticField = Typeface.class.getDeclaredField("SERIF");
staticField.setAccessible(true);
staticField.set(null,Typeface.createFromAsset(context.getAssets(), fontName));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
这里请注意,大家都知道android有三种默认字体,分别是MONOSPACE,SERIF,SANS_SERIF。
上面代码里面这三种都可以用反射去修改。但是千万不要去反射修改DEFAULT。
然后:在style.xml里面。设置
<style name="AppTheme" parent="AppBaseTheme">
<item name="android:typeface">serif</item>
</style>
最后在AndroidManifest.xml中使用这个主题就可以了。
这里我要说一下,serif里面的取值范围在(normal,serif,sans,monospace)后面3个都对应这Typeface中的静态字段,唯独normal不是对应Typeface中的DEFAULT,所以在反射和配置主题的时候一定要注意是否一致。
这里全局都是字体就完成了。是不是很方便?哈哈。
但是别高兴的太早了。
这个解决方案对android5.0貌似不行,似乎和5.0的主题有些不兼容。
如果主题对你不是很重要,可以使用旧主题。否则,你还是老老实实的要么一个一个改,要么递归去改