2016-08-03 15 views
1

私はカスタムTextViewを持っています。私のサーバからすべてのテキストを取得するので、どのようなスタイルが来るのか分かりません。例として、これは、bold,italicおよびそれ以上Textstylesを含むことができる。しかし、実際にどのように実行時にそれを処理するかわからない。実行時にテキストビューの書体を変更します

私は私が使用したいすべての私のフォントとassetsフォルダ作成:

enter image description here

をそして、私のCustomTextViewに私はこのような何か試してみました:これは私のFontCacheクラスです

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); 
    } 
} 

} 

を:

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; 
} 

} 

しかし、どのように動作するか、どのようにこれを達成するための任意のアイデアではない帽子? ありがとうございました!

+1

のようにそれを呼び出すことができますか? – Blackbelt

+0

ありがとう、私はそれを追加しました! – Davis

+0

はうまく見えます。問題は何ですか? – Blackbelt

答えて

1

あなたはsetTypeface(Typeface tf, int style)

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

をオーバーライドすることができますし、 `FontCache`何で外からあなたは

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

これは役に立ちました、ありがとうございました! – Davis

+0

あなたは大歓迎です – Blackbelt

関連する問題