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 {@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.CusFntTextView android:id="@+id/tvtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hi Android" android:textAppearance="?android:attr/textAppearanceLarge" />
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。