使用Theme.AppCompat在主题中定义的Android chrisjenx / Calligraphy自定义字体不起作用

时间:2016-04-02 12:19:01

标签: android textview android-styles custom-font

我想在Theme中使用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>

3 个答案:

答案 0 :(得分:2)

您必须为每个活动编写以下代码,而不是在Application类中编写。 最好把它放在BaseActivity中并在所有其他活动中扩展它

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

我能够使用您的代码并在我的最终实现。

答案 1 :(得分:1)

首先尝试创建一个应用程序类

MyApplication.java

 @Override
public void onCreate() {
TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); // font from assets: "assets/fonts/chrisjenx.ttf
}

然后创建一个类 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>

多数民众赞成

答案 2 :(得分:0)

您需要在资产文件夹中创建名为“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()
        );
}