是否可以为整个应用程序设置自定义字体?API 21 安卓 5.0

2022-08-31 05:22:52

我需要为整个应用程序使用某种字体。我有.ttf文件。是否可以在应用程序启动时将其设置为默认字体,然后在应用程序中的其他位置使用它?设置后,如何在布局 XML 中使用它?


答案 1

是的,有反思。这有效(基于这个答案):

(注意:由于缺乏对自定义字体的支持,这是一种解决方法,因此,如果您想更改这种情况,请在此处对Android问题进行星号投票)。注意:不要在这个问题上留下“我也是”的评论,每个盯着它的人都会在这样做时收到一封电子邮件。所以请“星星”它。

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

然后,您需要重载几个默认字体,例如在应用程序类中:

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

或者,当然,如果您使用相同的字体文件,则可以对此进行改进以仅加载一次。

但是,我倾向于只覆盖一个,比如说,然后设置一个样式来强制该字体字体应用程序宽:"MONOSPACE"

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <item name="android:typeface">monospace</item>
    </style>
</resources>

API 21 安卓 5.0

我已经调查了评论中的报告,它不起作用,并且似乎与主题不兼容。android:Theme.Material.Light

如果该主题对您不重要,请使用较旧的主题,例如:

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

答案 2

在android中有一个很棒的自定义字体库:书法

这是如何使用它的示例。

在 Gradle 中,您需要将此行放入应用的 build.gradle 文件中:

dependencies {
    compile 'uk.co.chrisjenx:calligraphy:2.2.0'
}

然后创建一个扩展并编写以下代码的类:Application

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath("your font path")
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );
    }
} 

并在活动类中将此方法放在 onCreate 之前:

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

清单文件的最后一件事应该如下所示:

<application
   .
   .
   .
   android:name=".App">

它会将整个活动更改为您的字体!它简单干净!


推荐