2016-08-03 19 views
1

Ich habe eine benutzerdefinierte TextView und ich bekomme alle meine Text von meinem Server, so dass ich nie wissen, welcher Stil kommt. Zum Beispiel kann dies bold, italic und mehr Textstyles enthalten. Aber ich bin mir nicht sicher, wie ich das zur Laufzeit handhaben soll.Ändern Schriftarten zur Laufzeit für Textview

Ich habe einen assets Ordner mit allen meinen Schriften i verwenden möchte:

Ich habe versucht, so etwas wie diese

enter image description here

Und in meinem 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); 
    } 
} 

} 

Das ist meine Fontcache-Klasse :

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

} 

Aber t Hüte nicht wie es funktioniert, irgendwelche Ideen, wie man das erreicht? Vielen Dank!

+1

was 'FontCache' ist anrufen können? – Blackbelt

+0

Danke, ich habe es hinzugefügt! – Davis

+0

das sieht gut aus. Was ist das Problem ? – Blackbelt

Antwort

1

könnten Sie setTypeface(Typeface tf, int style)

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

und von außen außer Kraft setzen Sie es wie

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

Das war hilfreich, danke! – Davis

+0

Sie sind willkommen – Blackbelt

Verwandte Themen