Android chrisjenx/Calligraphy 使用 Theme.AppCompat 在主题中定义的自定义字体不起作用
Android chrisjenx/Calligraphy Custom font defined in Theme using Theme.AppCompat not working
我想在主题中使用 chrisjenx/Calligraphy 来更改我整个项目中的字体。
我按照说明操作,但它对我不起作用
这是我的代码:
申请中:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(base));
}
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("BElham.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
}
这是我的风格
<!-- Base application theme. -->
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">>
<item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>
<style name="AppTheme" parent="AppBaseTheme">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.Widget"/>
<style name="AppTheme.Widget.TextView" parent="android:Widget.TextView">
<item name="fontPath">BElham.ttf</item>
</style>
首先尝试创建一个应用程序 class
MyApplication.java
@Override
public void onCreate() {
TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); // font from assets: "assets/fonts/chrisjenx.ttf
}
然后创建一个class
TypefaceUtil.java
import android.content.Context;
import android.graphics.Typeface;
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) {
System.out.println("Can not set custom font "
+ customFontFileNameInAssets + " instead of "
+ defaultFontNameToOverride);
}
}
}
在您的 style.xml 主题中添加例如
<style name="MyMaterialTheme.Base"parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:typeface">serif</item>
</style>
就是这样
您需要在资产文件夹中创建一个名为 "fonts" 的文件夹并将字体放入其中
你的字体路径应该是这样的 assets/fonts/BElham.ttf
然后像这样定义字体
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/BElham.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
}
您必须为每个 activity 而不是在应用程序 class 中编写以下代码。
最好把它放在 BaseActivity 中并在所有其他 Activity
中扩展它
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(base));
}
我可以使用你的代码并在我这边实现。
我想在主题中使用 chrisjenx/Calligraphy 来更改我整个项目中的字体。
我按照说明操作,但它对我不起作用
这是我的代码:
申请中:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(base));
}
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("BElham.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
}
这是我的风格
<!-- Base application theme. -->
<style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">>
<item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>
<style name="AppTheme" parent="AppBaseTheme">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.Widget"/>
<style name="AppTheme.Widget.TextView" parent="android:Widget.TextView">
<item name="fontPath">BElham.ttf</item>
</style>
首先尝试创建一个应用程序 class
MyApplication.java
@Override
public void onCreate() {
TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); // font from assets: "assets/fonts/chrisjenx.ttf
}
然后创建一个class TypefaceUtil.java
import android.content.Context;
import android.graphics.Typeface;
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) {
System.out.println("Can not set custom font "
+ customFontFileNameInAssets + " instead of "
+ defaultFontNameToOverride);
}
}
}
在您的 style.xml 主题中添加例如
<style name="MyMaterialTheme.Base"parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:typeface">serif</item>
</style>
就是这样
您需要在资产文件夹中创建一个名为 "fonts" 的文件夹并将字体放入其中
你的字体路径应该是这样的 assets/fonts/BElham.ttf
然后像这样定义字体
@Override
public void onCreate() {
super.onCreate();
CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
.setDefaultFontPath("fonts/BElham.ttf")
.setFontAttrId(R.attr.fontPath)
.build()
);
}
您必须为每个 activity 而不是在应用程序 class 中编写以下代码。 最好把它放在 BaseActivity 中并在所有其他 Activity
中扩展它@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(base));
}
我可以使用你的代码并在我这边实现。