是否可以为整个应用程序设置自定义字体?API 21 安卓 5.0
2022-08-31 05:22:52
我需要为整个应用程序使用某种字体。我有.ttf文件。是否可以在应用程序启动时将其设置为默认字体,然后在应用程序中的其他位置使用它?设置后,如何在布局 XML 中使用它?
我需要为整个应用程序使用某种字体。我有.ttf文件。是否可以在应用程序启动时将其设置为默认字体,然后在应用程序中的其他位置使用它?设置后,如何在布局 XML 中使用它?
是的,有反思。这有效(基于这个答案):
(注意:由于缺乏对自定义字体的支持,这是一种解决方法,因此,如果您想更改这种情况,请在此处对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>
我已经调查了评论中的报告,它不起作用,并且似乎与主题不兼容。android:Theme.Material.Light
如果该主题对您不重要,请使用较旧的主题,例如:
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:typeface">monospace</item>
</style>
在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">
它会将整个活动更改为您的字体!它简单干净!