无法在Android应用中更改默认字体

时间:2016-02-05 13:23:22

标签: java android android-layout

我正在尝试更改应用中的默认字体。但它不起作用。这些是我采取的步骤:

1)创建了类 TypefaceUtil.java

import android.content.Context;
import android.graphics.Typeface;
import android.util.Log;

import java.lang.reflect.Field;

public class TypefaceUtil {

public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
    try {
        final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

        final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
        defaultFontTypefaceField.setAccessible(true);
        defaultFontTypefaceField.set(null, customFontTypeface);
    } catch (Exception e) {
        Log.e("CustomFontException", "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
    }
  }
}

2)在扩展应用程序

的类中
public void onCreate() {

     super.onCreate();
     TypefaceUtil.overrideFont(getApplicationContext(), "MONOSPACE", "fonts/varelaround_regular.ttf");
 }

3)在 styles.xml

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
     <item name="android:typeface">monospace</item>
 </style>

仍然无法正常工作。我错过了什么吗?

3 个答案:

答案 0 :(得分:2)

我曾经遇到过这个问题。我不太清楚为什么会这样,但你可以尝试以下方法: 而不是“等宽”,尝试以下各项: DEFAULT,SANS_SERIF,SERIF。它可能不适用于所有文本视图,例如ListView或recyclerView中的文本视图(很奇怪,对吧?)。但在这些情况下,我以编程方式从适配器设置字体。 很抱歉无法解释原因。

答案 1 :(得分:1)

为此,我强烈建议您使用Calligraphyhttps://github.com/chrisjenx/Calligraphy,一个非常棒的库,真正的直接改变默认字体,并具有许多其他有用的功能。

您需要设置的所有内容都应该在自述文件中。

答案 2 :(得分:0)

为什么不定义自定义TextView并为其指定任何字体。

import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.EditText;

import com.exmple.util.Utility;

public class CustomFontEditText extends EditText {

    private Context mContext;

    private String ttfName;

    String TAG = getClass().getName();

    public CustomFontEditText(Context context) {
        super(context);
        this.mContext = context;
    }

    public CustomFontEditText(Context context, AttributeSet attrs) {
        super(context, attrs);

        this.mContext = context;

        // Typeface.createFromAsset doesn't work in the layout editor.
        // Skipping...
        if (isInEditMode()) {
            return;
        }

        for (int i = 0; i < attrs.getAttributeCount(); i++) {
            this.ttfName = attrs.getAttributeValue(Utility.ATTRIBUTE_SCHEMA,
                    Utility.ATTRIBUTE_TTF_KEY);

            if (null != ttfName)
                init();
        }

    }

    public CustomFontEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.mContext = context;
    }

    private void init() {
        Typeface font = Utility.getFonts(mContext, ttfName);
        if (null != font)
            setTypeface(font);
    }

    @Override
    public void setTypeface(Typeface tf) {

        super.setTypeface(tf);
    }

}

在Utility类的哈希映射中加载和存储资产中的字体,以便以后可以重用字体。想象一下每次加载新视图时加载字体.. OOM .. !!!

private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();
public static Typeface getFonts(Context context, String fontName) {
    Typeface typeface = TYPEFACE.get(fontName);
    if (typeface == null) {
        typeface = Typeface.createFromAsset(context.getAssets(), "fonts/"+fontName);
        TYPEFACE.put(fontName, typeface);
    }
    return typeface;
}

添加ttf属性以从xml

设置字体
public static final String ATTRIBUTE_TTF_KEY = "ttf_name";

public static final String ATTRIBUTE_SCHEMA = "http://schemas.android.com/apk/lib/com.exmaple.ui.customfont";

现在在你的布局文件中使用

 <com.example.ui.customviews.CustomFontEditText
            xmlns:font="http://schemas.android.com/apk/lib/com.exmaple.ui.customfont"
            android:id="@+id/edt_pay_input"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="20dp"
            android:background="@null"
            android:cursorVisible="false"
            android:drawableBottom="@drawable/dashed_white"
            android:includeFontPadding="false"
            android:inputType="numberDecimal"
            android:maxLength="4"
            android:minWidth="20dp"
            android:singleLine="true"
            android:textColor="@color/white"
            android:textSize="30sp"

            font:ttf_name="FedraSansStd-Light.otf" >

            <requestFocus />
        </com.example.ui.customviews.CustomFontEditText>

您可以对Button,TextView等执行相同的操作。