Android 使用反射更换app全部字体

需要自己下载字体文件

一、自定义类继承

public class SetAppTypeface extends MultiDexApplication {
    public static Typeface typeFace;

    @Override
    public void onCreate() {
        super.onCreate();
        x.Ext.init(this);
        x.Ext.setDebug(false);
        setTypeface();
    }
    public void setTypeface(){
        typeFace = Typeface.createFromAsset(getAssets(), "fonts/RobotoCondensed-Regular.ttf");
        try
        {
            //与values/styles.xml中的serif对应
//            Field field = Typeface.class.getDeclaredField("SERIF");
//            field.setAccessible(true);
//            field.set(null, typeFace);

//            Field field_1 = Typeface.class.getDeclaredField("DEFAULT");
//            field_1.setAccessible(true);
//            field_1.set(null, typeFace);

            //与monospace对应
//            Field field_2 = Typeface.class.getDeclaredField("MONOSPACE");
//            field_2.setAccessible(true);
//            field_2.set(null, typeFace);

            //与values/styles.xml中的sans对应
            Field field_3 = Typeface.class.getDeclaredField("SANS_SERIF");
            field_3.setAccessible(true);
            field_3.set(null, typeFace);
        }
        catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }
}
二、修改values/styles.xml文件
    
    

      
      
      
      
这里android:typeface可以设置的仅仅有normal、sans、serif、monospace可以设置,因为我在SetAppTypeface类中设置的是Typeface.class.getDeclaredField("SANS_SERIF"); 所以我这里便设置成sans,如果getDeclaredField()设置的是其他的类型,则要选择同类型的其他诸如serif、monospace等等
三、修改AndroidManifest.xml

        android:name=".SetAppTypeface"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/SetAppFont">
        
            
                

                
            
        

这样即可修改app所有的字体。
如果有些字体想换回去可以单独设置
    textView01=(TextView)super.findViewById(R.id.TextView01);
    textView01.setTypeface(null, Typeface.NORMAL);

你可能感兴趣的:(问题记录)