Android 5.0以上 app全局字体替换

记录个日常开发问题


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

十分无奈还是去换了


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

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

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

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

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


于是乎就用反射

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


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

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

/**
 * Description
 * 

* 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, 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



你可能感兴趣的:(android)