在我的应用程序中使用了ClementePDaa-Hairline.ttf字体。 ClementePDaa-Hairline.ttf字体在android 4.3及以下版本中完美运行。但android 4.4这种字体不在应用程序中显示。帮帮我为什么ClementePDaa-Hairline.ttf字体在android 4.4和4.4.2中不起作用
在Android 4.3及以下版本中,它会在应用程序中显示ClementePDaa-Hairline.ttf字体。
在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"));
答案 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)
如果您通过方法
将文本设置为TextViewtextView.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);