Android 5.0以上 app全局字体替换

记录个日常开发问题


最近设计认为app字体太丑了...要求换成ios的字体

十分无奈还是去换了


一般有三种方式,递归页面的所有控件替换,自定义控件替换,反射替换

然后这个攻略很多了,就不细说方法了

然后都试了试,反射好用点

递归在性能差的手机上有明显卡顿

为了换字体专门写个自定义控件,还要全局替换,以后写还要注意用自定义控件,感觉...嗯,好蠢


于是乎就用反射

然后记录个坑,也是查了好一阵子才发现的


Theme.Material主题和非Theme.Material主题(Theme.Holo主题,或Theme.AppCompat主题)

在5.0以上版本主题不同,反射替换字体的方式也不同

/**
 * Description
 * <p>
 * Theme.Material主题
 * Theme.Holo主题,Theme.AppCompat主题
 */
private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) {
   try {
      final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
      staticField.setAccessible(true);
      staticField.set(null, newTypeface);
   } catch (Exception e) {
      e.printStackTrace();
   }
}

/**
 * Description Theme.Material主题
 */
private static void replaceFontMaterial(String staticTypefaceFieldName, final Typeface newTypeface) {
   //android 5.0及以上我们反射修改Typeface.sSystemFontMap变量
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      Map<String, Typeface> newMap = new HashMap<>();
      newMap.put(staticTypefaceFieldName, newTypeface);
      try {
         final Field staticField = Typeface.class.getDeclaredField("sSystemFontMap");
         staticField.setAccessible(true);
         staticField.set(null, newMap);
      } catch (NoSuchFieldException | IllegalAccessException e) {
         e.printStackTrace();
      }
   } else {
      try {
         final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
         staticField.setAccessible(true);
         staticField.set(null, newTypeface);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

附代码:https://github.com/459905207/FontUtils



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值