自定义字体不在android 4.4中显示

时间:2013-12-30 06:42:19

标签: android fonts typeface

在我的应用程序中使用了ClementePDaa-Hairline.ttf字体。 ClementePDaa-Hairline.ttf字体在android 4.3及以下版本中完美运行。但android 4.4这种字体不在应用程序中显示。帮帮我为什么ClementePDaa-Hairline.ttf字体在android 4.4和4.4.2中不起作用

In android 4.3 and below

在Android 4.3及以下版本中,它会在应用程序中显示ClementePDaa-Hairline.ttf字体。

In android 4.4.0 and above

在android 4.4及以上版本中,ClementePDaa-Hairline.ttf字体不会显示在应用程序中。

public class TypefaceClass {


    public static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {                     
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }

}





// IN ACTIVITY

TextView textview = (TextView)findViewById(R.id.t1);
textview.setTypeface(TypefaceClass.get(getApplicationContext(),
                "fonts/ClementePDaa-Hairline.ttf"));

5 个答案:

答案 0 :(得分:4)

请检查一下。它可能会帮助你。 像这样创建一个字体类。

public class TypefaceClass {


        public static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

        public static Typeface get(Context c, String assetPath) {
            synchronized (cache) {
                if (!cache.containsKey(assetPath)) {
                    try {
                        Typeface t = Typeface.createFromAsset(c.getAssets(),
                                assetPath);
                        cache.put(assetPath, t);
                    } catch (Exception e) {                     
                        return null;
                    }
                }
                return cache.get(assetPath);
            }
        }

}

在资源中创建一个字体文件夹,并将您的字体放在该文件夹中。然后使用上面的字体类 setTypeface

textView.setTypeface(TypefaceClass.get(context,
                "font/your_font.ttf"));

修改

请尝试使用.otf文件而不是.ttf文件。它肯定会解决你的问题。上面4.4中的.ttf文件存在一些问题。所以尝试获取字体的.otf文件。

答案 1 :(得分:2)

使用此功能在设备sdk版本上设置字体

int currentapiVersion = android.os.Build.VERSION.SDK_INT;
                if (currentapiVersion >=
                        android.os.Build.VERSION_CODES.KITKAT) {
                    font = Typeface.DEFAULT;
                }else{
                    font = Typeface.createFromAsset(context.getAssets(), "CALIBRI.TTF");
                }

答案 2 :(得分:1)

答案 3 :(得分:0)

我在自定义字体方面遇到了同样的问题,除了4.4.2之外,它在所有Android版本上都能正常运行。我将“.ttf”转换为“.otf”,现在没关系。

答案 4 :(得分:0)

如果您通过方法

将文本设置为TextView
textView.setText(Html.fromHtml(text));

文本的html样式(即使为空可能会覆盖您在TextView上设置的上一个字体。要修复它,您可以覆盖方法setText

@Override
public void setText(CharSequence text, BufferType type) {
    super.setText(text, type);
    if (fontType != null) {
        initTypeface();
    }
 }

我的完整解决方案,因此您可以在代码和xml上使用自定义TextView(假设您拥有assets / font / folder下的字体文件

public class CustomTextView extends TextView {

String TAG = CustomTextView.class.getSimpleName();

public enum FontType {
    MONTSERRAT_BOLD, MONSERRAT_REGULAR, PROXIMANOVA_REGULAR, PROXIMANOVA_REGULAR_ITALIC
}

/* Default font */
private FontType fontType = FontType.MONSERRAT_REGULAR;

/* Constructor from xml */
public CustomTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initTypeface(attrs);

}
/* Constructor from xml */
public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initTypeface(attrs);
}
/* Constructor from code */
public CustomTextView(Context context) {
    super(context);
    initTypeface();
}
/* Constructor from code */
public CustomTextView(Context context, FontType fontType) {
    super(context);
    this.fontType = fontType;

    initTypeface();
}

private void initTypeface() {

    setLineSpacing(10, 1);
    String fontName = null;
    switch (fontType) {

        case MONTSERRAT_BOLD:

            fontName = "MontserratBold.otf";
            break;
        case MONSERRAT_REGULAR:
            fontName = "MontserratRegular.otf";
            break;
        case PROXIMANOVA_REGULAR:
            fontName = "ProximaNovaRegular.otf";
            break;
        case PROXIMANOVA_REGULAR_ITALIC:
            fontName = "ProximaNovaRegularItalic.otf";
            break;

        default:
            fontName = "MontserratRegular.otf";
    }
    if (!TextUtils.isEmpty(fontName)) {

        Typeface t = Typeface.createFromAsset(getContext().getAssets(), "font/" + fontName);
        this.setTypeface(t);
    }


}

@Override
public void setText(CharSequence text, BufferType type) {
    super.setText(text, type);
    if (fontType != null) {
        initTypeface();
    }
}

private void initTypeface(AttributeSet attrs) {


    TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTextView, 0, 0);
    if (a != null) {
        int enumPosition = a.getInteger(R.styleable.CustomTextView_fontType, 0);

        this.fontType = FontType.values()[enumPosition];      

        initTypeface();
    }


 }

}

为了能够在xml上实例化类,你需要在值attrs.xml下创建一个枚举

<declare-styleable name="CustomTextView">
    <attr name="fontType" format="enum">
        <enum name="monserrat_bold" value="0" />
        <enum name="monserrat_regular" value="1" />
        <enum name="proximanova_regular" value="2" />
        <enum name="proximanova_italic" value="3" />

    </attr>
</declare-styleable>

然后您可以在xml上实例化您的视图

 <com.yourpackagename.views.textViews.CustomTextView      xmlns:custom="http://schemas.android.com/apk/res-auto"
            android:id="@+id/test_name_text_view"
            custom:fontType="monserrat_bold"
            style="@style/AppFont.Assessment.TestTitle"
            android:layout_marginStart="@dimen/top_bar_margin_start"
            android:layout_marginTop="@dimen/top_bar_margin_start"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

或来自代码

CustomTextView textView = new CustomTextView(context, CustomTextView.FontType.MONSERRAT_REGULAR);