Android为整个应用切换第三方字体

一、

1、通过反射来获取系统字体并替换

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();}}}2、在Application类中执行修改字体(替换系统默认字体)

public final class Application extends android.app.Application {@Overridepublic void onCreate() {super.onCreate();FontsOverride.setDefaultFont(this, "DEFAULT", "MyFontAsset.ttf");FontsOverride.setDefaultFont(this, "MONOSPACE", "MyFontAsset2.ttf");FontsOverride.setDefaultFont(this, "SERIF", "MyFontAsset3.ttf");FontsOverride.setDefaultFont(this, "SANS_SERIF", "MyFontAsset4.ttf");}}二、

配置文件AndroidManifest.xml中修改(只限系统theme中已有字体)

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"><item name="android:typeface">monospace</item></style>三、遍历viewGroup下所有文本控件并设置字体

/** * Recursively sets a {@link Typeface} to all * {@link TextView}s in a {@link ViewGroup}. */public static final void setAppFont(ViewGroup mContainer, Typeface mFont, boolean reflect){if (mContainer == null || mFont == null) return;final int mCount = mContainer.getChildCount();// Loop through all of the children.for (int i = 0; i < mCount; ++i){final View mChild = mContainer.getChildAt(i);if (mChild instanceof TextView){// Set the font if it is a TextView.((TextView) mChild).setTypeface(mFont);}else if (mChild instanceof ViewGroup){// Recursively attempt another ViewGroup.setAppFont((ViewGroup) mChild, mFont);}else if (reflect){try {Method mSetTypeface = mChild.getClass().getMethod("setTypeface", Typeface.class);mSetTypeface.invoke(mChild, mFont);} catch (Exception e) { /* Do something… */ }}}}final Typeface mFont = Typeface.createFromAsset(getAssets(),"fonts/MyFont.ttf"); final ViewGroup mContainer = (ViewGroup) findViewById(android.R.id.content).getRootView();HomeActivity.setAppFont(mContainer, mFont);四、自定义控件并设置字体

public class CusFntTextView extends TextView {public CusFntTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public CusFntTextView(Context context, AttributeSet attrs) {super(context, attrs);init();}public CusFntTextView(Context context) {super(context);init();}private void init() {if (!isInEditMode()) {Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "Futura.ttf");setTypeface(tf);}}<com.packagename.CusFntTextViewandroid:id="@+id/tvtitle"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hi Android"android:textAppearance="?android:attr/textAppearanceLarge"/>

,我想,这就是旅行的真义吧。

Android为整个应用切换第三方字体

相关文章:

你感兴趣的文章:

标签云: