如何在Android中为整个应用程序设置自定义字体

时间:2015-11-28 11:40:51

标签: java android layout fonts

好的,所以我对此进行了研究,并找到了一些与该主题相关的代码,但在我尝试时它似乎并不起作用。我个人不得不改变每个文本视图的字体,它让我疯了。到目前为止我所做的是创建一个将覆盖字体的类:

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();
    }
}
}

然后每次我希望覆盖每个类中的字体时,我试图实现这个:

   FontsOverride.setDefaultFont(this, "DEFAULT", "ComicRelief.ttf");

必须有一个简单的方法来做到这一点我已经尝试了几个小时而且无法理解它。

2 个答案:

答案 0 :(得分:0)

只需创建一个自定义TextView类:

public class CustomTextView extends TextView {

    public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        load();
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        load();
    }

    public CustomTextView(Context context) {
        super(context);
        load();
    }

    public void load() {
        setTypeface(
            Typeface.createFromAsset(getContext().getAssets(), "pacifico.ttf"), 1
        );
    }

}

为您希望的任何TextView应用自定义视图:

<com.your.package.views.CustomTextView
    android:id="@+id/my_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

现在声明TextView类型并将其强制转换为CustomTextView:

CustomTextView myTextView = (CustomTextView) findViewById(R.id.my_text_view);

请记住将适当的字体放入资源文件夹中(在本例中,它是“pacifico.ttf”)。

答案 1 :(得分:0)

您需要使用Calligraphy库来为整个应用设置自定义字体。

在自定义应用程序类中,onCreate()中的init Calligraphy:

CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath("fonts/custom_font.ttf")
                        .setFontAttrId(R.attr.fontPath)
                        .build());

此处,custom_font.ttf是您要应用于整个应用的字体,它需要驻留在assets/fonts文件夹中。

其次,您需要覆盖Activity类中的attachBaseContext()方法,如下所示:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

现在,您在应用中看到的每个文字都有通过书法设置为默认字体。