2017-06-10 4 views
0

Je veux définir une police personnalisée à tous textviews dans mon App.I utilisés ci-dessous le codecomment définir la police personnalisée pour une application entière dans lollipop

public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) 
    { 
     try 
     { 
      final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(),customFontFileNameInAssets); 
      Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride); 
      defaultFontTypefaceField.setAccessible (true); 
      defaultFontTypefaceField.set(null,customFontTypeface); 
     } 
     catch (Exception e) 
     { 
      Log.e("getMessage",e.getMessage()); 
      e.printStackTrace(); 
      //Log.e("Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride); 
     } 

    } 

et appeler la méthode comme ci-dessous

TypefaceUtil.overrideFont(this, "DEFAULT", getTypeFace()); 
     TypefaceUtil.overrideFont(this, "MONOSPACE", getTypeFace()); 
     TypefaceUtil.overrideFont(this, "SERIF", getTypeFace()); 
     TypefaceUtil.overrideFont(this, "SANS_SERIF", getTypeFace()); 

ce code de travail dans android avant android 5 bon mais il ne fonctionne pas en sucette. Je recherche beaucoup mais je ne trouve rien.

+0

Vous devez également mettre en œuvre comme ' serif- monospaces' –

Répondre

3

J'ai fait cela en utilisant Calligraphy

dans votre classe d'application dans la méthode #onCreate().

@Override 
public void onCreate() { 
    super.onCreate(); 
    CalligraphyConfig.initDefault(new CalligraphyConfig.Builder() 
          .setDefaultFontPath("fonts/Roboto-RobotoRegular.ttf") 
          .setFontAttrId(R.attr.fontPath) 
          .build() 
      ); 
    //.... 
} 

Enroulez le contexte d'activité:

@Override 
protected void attachBaseContext(Context newBase) { 
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); 
} 
+0

votre code grâce dans les activités très bien mais dans les dialogues ça ne marche pas. Une idée? –

+0

@zohrehkh si vous avez une activité de base et que vous avez implémenté la méthode attachTheBaseContext. Cela devrait fonctionner pour toutes les activités qui héritent de BaseActivity –

+0

Cela ne fonctionne pas pour les vues créées en code, uniquement via XML. – user3690202

0

Supposons que votre police sélectionnée est serif-monospace, alors vous devriez également mettre en œuvre comme

<style name="TextView" parent="android:Widget.TextView"> 
     <item name="android:fontFamily">serif-monospace</item> 
    </style> 

et utiliser comme celui-ci

<TextView 
    style="@style/TextView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"/> 
2

Je l'ai fait en remplaçant les polices par défaut d'application:

Créer une classe FontsOverride:

public final class FontsOverride { 

public static void setDefaultFont(Context context, 
            String staticTypefaceFieldName, String fontAssetName) { 
    final Typeface regular = Typeface.createFromAsset(context.getAssets(), 
      fontAssetName); 
    replaceFont(staticTypefaceFieldName, regular); 
} 

private static void replaceFont(String staticTypefaceFieldName, 
           final Typeface newTypeface) { 
    try { 
     final Field staticField = Typeface.class 
       .getDeclaredField(staticTypefaceFieldName); 
     staticField.setAccessible(true); 
     staticField.set(null, newTypeface); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

Créer une Application classe ou l'ajouter à votre actuel si vous avez déjà:

public class AppController extends Application { 

// add a folder named `fonts` under `assets` folder 
// add theme here 
String customFont1 = "fonts/IRANSans-Light-web.ttf"; 
String customFont2 = "fonts/font2.ttf"; 
String customFont3 = "fonts/font3.ttf"; 
String customFont4 = "fonts/font4.ttf"; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    // override default fonts 
    FontsOverride.setDefaultFont(this, "DEFAULT", customFont1); 
    FontsOverride.setDefaultFont(this, "MONOSPACE", customFont2); 
    FontsOverride.setDefaultFont(this, "SERIF", customFont3); 
    FontsOverride.setDefaultFont(this, "SANS_SERIF", customFont4); 

} 

}

Ajouter caractères sur votre thème dans style

<!-- Application theme --> 
<style name="myTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    <item name="android:typeface">monospace</item> 
</style> 

Enfin, l'ajouter à votre manifest en Application tag:

<application 
    android:name="path.AppController" 
    android:icon="@mipmap/ic_launcher" 
    android:theme="@style/myTheme" 
    android:label="@string/app_name"> 

(je l'ai testé et il fonctionne sur `Lolipop aussi)

0

J'ai fait une fonction récursive et gardé dans mon BaseActivity:

public static void overrideFonts(final Context context, final View v) { 
    try { 
     if (v instanceof ViewGroup) { 
      ViewGroup vg = (ViewGroup) v; 
      for (int i = 0; i < vg.getChildCount(); i++) { 
       View child = vg.getChildAt(i); 
       overrideFonts(context, child); 
      } 
     } 
     if (v.getClass() == TextView.class) { 
      if (v.getTag() != null && v.getTag().toString().equalsIgnoreCase("bold")) { 
       ((TextView) v).setTypeface(FontUtils.getFontBold(context)); 
      } else { 
       ((TextView) v).setTypeface(FontUtils.getFont(context)); 
      } 
     } 

     if (v.getClass() == AppCompatTextView.class) { 
      if (v.getTag() != null && v.getTag().toString().equalsIgnoreCase("bold")) { 
       ((TextView) v).setTypeface(FontUtils.getFontBold(context)); 
      } else { 
       ((TextView) v).setTypeface(FontUtils.getFont(context)); 
      } 
     } 

     if (v.getClass() == Button.class) { 
      ((Button) v).setTypeface(FontUtils.getFontBold(context)); 
     } 
     if (v.getClass() == AppCompatButton.class) { 
      ((Button) v).setTypeface(FontUtils.getFontBold(context)); 
     } 

     if (v.getClass() == TextInputLayout.class) { 
      ((TextInputLayout) v).setTypeface(FontUtils.getFontBold(context)); 
     } 
     if (v.getClass() == TextInputEditText.class) { 
      ((TextInputEditText) v).setTypeface(FontUtils.getFont(context)); 
     } 
     if (v.getClass() == AppCompatEditText.class) { 
      ((AppCompatEditText) v).setTypeface(FontUtils.getFont(context)); 
     } 
     if (v.getClass() == EditText.class) { 
      if (v.getTag() != null && v.getTag().toString().equalsIgnoreCase("bold")) { 
       ((EditText) v).setTypeface(FontUtils.getFontBold(context)); 
      } else { 
       ((EditText) v).setTypeface(FontUtils.getFont(context)); 
      } 
     } 
    } catch (Exception e) { 
     Log.e("Font Exception", e.toString()); 
    } 
} 

FontUtils:

public abstract class FontUtils { 

    public static Typeface regular, bold; 

    public static Typeface getFont(Context appContext) { 
    if (regular == null) { 
     regular = Typeface.createFromAsset(appContext.getAssets(), "fonts/Lato-Regular.ttf"); 
    } 
    return regular; 
    } 


    public static Typeface getFontBold(Context appContext) { 
    if (bold == null) { 
     bold = Typeface.createFromAsset(appContext.getAssets(), "fonts/Lato-Bold.ttf"); 
    } 
    return bold; 
    } 
} 

Vous pouvez ajouter vos propres cas plus j'utiliser la balise dans le fichier XML pour les polices audacieuses et régulières

android:tag="bold" 

appeler la méthode onCreate du BaseActivity comme ceci:

View contentView = this.findViewById(android.R.id.content); 
overrideFonts(this, contentView); 

Assurez-vous d'appeler super.OnCreate après setContentView dans votre activité.

Espérons que cela aide.

0

Check out out: Working with fonts.

De E/S 2017 vous pouvez maintenant utiliser ce qui suit dans xml:

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:fontFamily="@font/lobster"/> 

Google a ajouté ce support pour les périphériques S, mais aussi, je cite:

La Beta Support Library 26,0 Prend en charge la fonctionnalité Polices en XML sur les appareils exécutant l'API Android version 14 ou ultérieure.