全局改變應用字體,三部曲:
第一部曲:聲明一個類繼承Application,重寫onCreate()方法,清單文件(AndroidManifest.xml)中記得聲明,代碼如下:
@Override public void onCreate() { /* * 現在介紹setDefaultFont方法參數,第一個上下文對象就熟悉了,第二個參數涉及到控件就會有一個屬性android:typeface * ,設置字體的話 Android系統默認支持三種字體,分別爲:“sans”, “serif”, “monospace" * 只要你爲你要設置字體樣式的控件設置android:typeface="monospace"這一屬性,這時一旦檢測到控件有這一屬性, * 那麼該控件的字體樣式就會被替換成"第三個參數"字體文件樣式; */ FontsOverride.setDefaultFont(this, "DEFAULT", "fonts/simkai.ttf"); FontsOverride.setDefaultFont(this, "MONOSPACE", "fonts/simkai.ttf"); FontsOverride.setDefaultFont(this, "SERIF", "fonts/simkai.ttf"); FontsOverride.setDefaultFont(this, "SANS_SERIF", "fonts/simkai.ttf"); super.onCreate(); }
第二部曲:聲明一個方法,代碼如下:
import java.lang.reflect.Field; import android.content.Context; import android.graphics.Typeface; public final class FontsOverride { public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) { final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName); replaceFont(staticTypefaceFieldName, regular); } protected static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) { try { final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName); staticField.setAccessible(true); staticField.set(null, newTypeface); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
第三部曲:主題風格中必須設置,否則不生效
<style name="AppTheme" parent="AppBaseTheme"> <item name="android:typeface">monospace</item> </style>