Textview在运行时更改字体

问题描述:

我有一个自定义TextView,我从我的服务器获取所有文本,所以我不知道什么风格即将到来。例如,这可以包括bold,italic和更多Textstyles。但我不知道如何在运行时处理它。Textview在运行时更改字体

我创造了我的所有字体的assets文件夹我想用:

enter image description here

在我CustomTextView我想是这样的:

public class CustomTextView extends TextView { 

private static final String ANDROID_SCHEMA = "http://schemas.android.com/apk/res/android"; 

public CustomTextView(Context context) { 
    super(context); 

    applyCustomFont(context, null); 
} 

public CustomTextView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    applyCustomFont(context, attrs); 
} 

public CustomTextView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 

    applyCustomFont(context, attrs); 
} 

private void applyCustomFont(Context context, AttributeSet attrs) { 

    //Workaround for Preview Mode 
    if (!isInEditMode()) { 
     int textStyle = attrs.getAttributeIntValue(ANDROID_SCHEMA, "textStyle", Typeface.NORMAL); 

     Typeface customFont = selectTypeface(context, textStyle); 
     setTypeface(customFont); 

    } else { 

     this.setTypeface(null, Typeface.NORMAL); 
    } 
} 

private Typeface selectTypeface(Context context, int textStyle) { 

    switch (textStyle) { 
     case Typeface.BOLD: // bold 
      return FontCache.getTypeface("fonts/OpenSans-Bold.ttf", context); 

     case Typeface.ITALIC: // italic 
      return FontCache.getTypeface("fonts/OpenSans-Italic.ttf", context); 

     default: 
      return FontCache.getTypeface("fonts/OpenSans-Regular.ttf", context); 
    } 
} 

} 

这是我FontCache类:

public class FontCache { 

//This caches the fonts while minimizing the number of accesses to the assets 

private static final HashMap<String, Typeface> fontCache = new HashMap<>(); 

public static Typeface getTypeface(String fontname, Context context) 
{ 
    Typeface typeface = fontCache.get(fontname); 

    if (typeface == null) 
    { 
     try { 
      typeface = Typeface.createFromAsset(context.getAssets(), fontname); 

     } catch (Exception e) { 
      return null; 
     } 

     fontCache.put(fontname, typeface); 
    } 

    return typeface; 
} 

} 

但是t帽子不是如何工作的,任何想法如何做到这一点? 谢谢!

+1

是什么'FontCache'? – Blackbelt

+0

谢谢,我加了! – Davis

+0

看起来不错。有什么问题? – Blackbelt

您可以覆盖setTypeface(Typeface tf, int style)

@Override 
public void setTypeface(Typeface tf, int style) { 
    Typeface customFont = selectTypeface(context, textStyle) 
    super.setTypeface(customFont, style); 
} 

从外面,你可以这样调用它

mTextView.setTypeface(null, Typeface.BOLD); 
+0

这很有帮助,谢谢! – Davis

+0

不客气 – Blackbelt