2016-02-05 11 views
5

Ich versuche, die Standardschriftart in meiner App zu ändern. Aber es funktioniert nicht. Dies sind Schritte, die ich getroffen haben:Ändern der Standardschriftart in Android-App nicht möglich

1) Erstellt Klasse TypefaceUtil.java

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.Log; 

import java.lang.reflect.Field; 

public class TypefaceUtil { 

public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) { 
    try { 
     final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets); 

     final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride); 
     defaultFontTypefaceField.setAccessible(true); 
     defaultFontTypefaceField.set(null, customFontTypeface); 
    } catch (Exception e) { 
     Log.e("CustomFontException", "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride); 
    } 
    } 
} 

2) In einer Klasse erweitern Anwendung:

public void onCreate() { 

    super.onCreate(); 
    TypefaceUtil.overrideFont(getApplicationContext(), "MONOSPACE", "fonts/varelaround_regular.ttf"); 
} 

3) In Stile. xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:typeface">monospace</item> 
</style> 

Immer noch nicht funktioniert. Fehle ich etwas?

+0

verwenden setzen Seltsam, ich benutzte den gleichen Code und es funktionierte gut für mich. Der einzige Unterschied ist, dass ich 'serif' anstelle von' monospace' verwendet habe. –

Antwort

2

Ich hatte dieses Problem einmal konfrontiert. Ich bin nicht ganz sicher, warum es funktioniert, aber Sie können Folgendes versuchen: Anstelle von "Monospace", versuchen Sie jede dieser: DEFAULT, SANS_SERIF, SERIF. Es funktioniert möglicherweise nicht für alle Textansichten, wie die in ListView oder RecyclerView (seltsam, nicht wahr?). Aber in diesen Fällen habe ich die Schriftart programmatisch aus dem Adapter gesetzt. Es tut uns leid, dass ich den Grund nicht erklären konnte.

+0

Danke, funktioniert. – SimenNash

1

Für diesen Zweck empfehle ich Ihnen, Calligraphy, https://github.com/chrisjenx/Calligraphy, eine tolle lib, wirklich strait-forward, um die Standardschrift mit ihm zu ändern, und hat viele andere nützliche Funktionen.

Alles, was Sie brauchen, um dies einzurichten, sollte in der Readme sein.

0

Warum definieren Sie nicht Ihr benutzerdefiniertes TextView und weisen Sie ihm keine Schriftart zu.

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.AttributeSet; 
import android.widget.EditText; 

import com.exmple.util.Utility; 

public class CustomFontEditText extends EditText { 

    private Context mContext; 

    private String ttfName; 

    String TAG = getClass().getName(); 

    public CustomFontEditText(Context context) { 
     super(context); 
     this.mContext = context; 
    } 

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

     this.mContext = context; 

     // Typeface.createFromAsset doesn't work in the layout editor. 
     // Skipping... 
     if (isInEditMode()) { 
      return; 
     } 

     for (int i = 0; i < attrs.getAttributeCount(); i++) { 
      this.ttfName = attrs.getAttributeValue(Utility.ATTRIBUTE_SCHEMA, 
        Utility.ATTRIBUTE_TTF_KEY); 

      if (null != ttfName) 
       init(); 
     } 

    } 

    public CustomFontEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     this.mContext = context; 
    } 

    private void init() { 
     Typeface font = Utility.getFonts(mContext, ttfName); 
     if (null != font) 
      setTypeface(font); 
    } 

    @Override 
    public void setTypeface(Typeface tf) { 

     super.setTypeface(tf); 
    } 

} 

Lade- und Speicher Schrift aus dem Asset in einer Hash-Karte in Ihrer Utility-Klasse, so dass Sie Schriftart später wiederverwenden. Stellen Sie sich vor, Sie laden die Schriftart jedes Mal, wenn die neue Ansicht geladen wird .. OOM .. !!!

private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>(); 
public static Typeface getFonts(Context context, String fontName) { 
    Typeface typeface = TYPEFACE.get(fontName); 
    if (typeface == null) { 
     typeface = Typeface.createFromAsset(context.getAssets(), "fonts/"+fontName); 
     TYPEFACE.put(fontName, typeface); 
    } 
    return typeface; 
} 

hinzufügen TTF Attribut Schriftart aus xml

public static final String ATTRIBUTE_TTF_KEY = "ttf_name"; 

public static final String ATTRIBUTE_SCHEMA = "http://schemas.android.com/apk/lib/com.exmaple.ui.customfont"; 

und jetzt in Ihrem Layout-Datei

<com.example.ui.customviews.CustomFontEditText 
      xmlns:font="http://schemas.android.com/apk/lib/com.exmaple.ui.customfont" 
      android:id="@+id/edt_pay_input" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginRight="20dp" 
      android:background="@null" 
      android:cursorVisible="false" 
      android:drawableBottom="@drawable/dashed_white" 
      android:includeFontPadding="false" 
      android:inputType="numberDecimal" 
      android:maxLength="4" 
      android:minWidth="20dp" 
      android:singleLine="true" 
      android:textColor="@color/white" 
      android:textSize="30sp" 

      font:ttf_name="FedraSansStd-Light.otf" > 

      <requestFocus /> 
     </com.example.ui.customviews.CustomFontEditText> 

Sie können das gleiche tun für Button, Textview usw.

Verwandte Themen