2016-02-05 9 views
5

Sto tentando di modificare il carattere predefinito nella mia app. Ma non funziona. Questi sono passi che ho preso:Impossibile modificare il carattere predefinito nell'app per Android

1) classe creata 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 una classe che estende Applicazione:

public void onCreate() { 

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

3) In stili. xml

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

Ancora non funziona. Mi sto perdendo qualcosa ?

+0

Strano, ho usato lo stesso codice e funzionava bene per me. L'unica differenza è che ho usato 'serif' invece di' monospace'. –

risposta

2

Ho affrontato questo problema una volta. Non sono sicuro del perché funzioni, ma puoi provare quanto segue: Invece di "monospazio", prova ognuno di questi: DEFAULT, SANS_SERIF, SERIF. Potrebbe non funzionare per tutte le visualizzazioni di testo, come quelle in ListView o recyclerView (strano, giusto?). Ma in quei casi, ho impostato il carattere tipicamente dall'adattatore. Ci scusiamo per non aver potuto spiegare il motivo.

+0

Grazie, funziona. – SimenNash

1

Per questo motivo, consiglio vivamente di utilizzare Calligraphy, https://github.com/chrisjenx/Calligraphy, una lib fantastica, davvero molto avanzata per cambiare il carattere predefinito con esso e ha molte altre utili funzionalità.

Tutto ciò che è necessario impostare dovrebbe essere nel file Leggimi.

0

Perché non definire il tuo TextView personalizzato e assegnare qualsiasi tipo di carattere.

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

} 

carico e memorizzare font dalla risorsa in una mappa di hash nella classe di utilità in modo da poter riutilizzare carattere più tardi. Immagina di caricare il font ogni volta che una nuova vista viene caricata .. 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; 
} 

Aggiungi TTF attributo per impostare dei caratteri da 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"; 

e ora utilizzare per le file di layout

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

si può fare lo stesso per Button, TextView ecc