当前位置: 代码迷 >> Android >> Android替整个应用切换第三方字体
  详细解决方案

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

热度:59   发布时间:2016-04-28 02:21:40.0
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 {    @Override    public 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 [email protected] Typeface} to all * [email protected] TextView}s in a [email protected] 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.CusFntTextView        android:id="@+id/tvtitle"        android:layout_width="wrap_content"        android:layout_height="wrap_content"                 android:text="Hi Android"                   android:textAppearance="?android:attr/textAppearanceLarge"      />



  相关解决方案