346 votes

Comment définir la famille de polices par défaut pour l'ensemble de l'application Android ?

J'utilise la police Roboto light dans mon application. Pour définir la police, je dois ajouter la balise android:fontFamily="sans-serif-light" à chaque vue. Existe-t-il un moyen de déclarer la police Roboto comme famille de polices par défaut pour toute l'application ? J'ai déjà essayé de le faire, mais cela ne semble pas fonctionner.

<style name="AppBaseTheme" parent="android:Theme.Light"></style>

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

2 votes

Cela pourrait vous aider : stackoverflow.com/a/16883281/1329733

2 votes

Vous pouvez désormais spécifier des polices personnalisées directement à partir du XML dans Android studio 3.0. developer.Android.com/guide/topics/ui/look-and-feel/

15voto

nirazverma Points 551

Ajoutez cette ligne de code dans votre fichier res/value/styles.xml

<item name="android:fontFamily">@font/circular_medium</item>

le style entier ressemblera à cela

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:fontFamily">@font/circular_medium</item>
</style>

changez "circular_medium" par votre propre nom de police

8voto

C'est très très très facile à faire dans Android Studio.

  1. Dans cette méthode, vous devez vérifier votre minsdkveriosn . Il doit avoir besoin minsdkversion >=16

Ex:

  1. Créez le dossier "font" dans le dossier "res". Dans Android studio New > Folder > Font Folder.

See image:

  1. Téléchargez votre fichier de police dans ce dossier de police.

Ex:

  1. Dans votre fichier style.xml, sous style dans "Base application theme" ajoutez cette ligne.

    <item name="android:fontFamily">@font/ubuntubold</item>

Ex:

7voto

Allen Chan Points 1231

Sans parler des performances, pour une police personnalisée, vous pouvez avoir une méthode récursive qui boucle sur toutes les vues et définit la police si c'est une TextView :

public class Font {
    public static void setAllTextView(ViewGroup parent) {
        for (int i = parent.getChildCount() - 1; i >= 0; i--) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                setAllTextView((ViewGroup) child);
            } else if (child instanceof TextView) {
                ((TextView) child).setTypeface(getFont());
            }
        }
    }

    public static Typeface getFont() {
        return Typeface.createFromAsset(YourApplicationContext.getInstance().getAssets(), "fonts/whateverfont.ttf");
    }
}

Dans toutes vos activités, passez-lui le ViewGroup actuel après setContentView et c'est terminé :

ViewGroup group = (ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content);
Font.setAllTextView(group);

Pour le fragment, vous pouvez faire quelque chose de similaire.

5voto

Une autre façon de faire cela pour l'ensemble de l'application est d'utiliser la réflexion basée sur ceci réponse

public class TypefaceUtil {
    /**
     * Using reflection to override default typefaces
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE
     * OVERRIDDEN
     *
     * @param typefaces map of fonts to replace
     */
    public static void overrideFonts(Map<String, Typeface> typefaces) {
        try {
            final Field field = Typeface.class.getDeclaredField("sSystemFontMap");
            field.setAccessible(true);
            Map<String, Typeface> oldFonts = (Map<String, Typeface>) field.get(null);
            if (oldFonts != null) {
                oldFonts.putAll(typefaces);
            } else {
                oldFonts = typefaces;
            }
            field.set(null, oldFonts);
            field.setAccessible(false);
        } catch (Exception e) {
            Log.e("TypefaceUtil", "Can not set custom fonts");
        }
    }

    public static Typeface getTypeface(int fontType, Context context) {
        // here you can load the Typeface from asset or use default ones
        switch (fontType) {
            case BOLD:
                return Typeface.create(SANS_SERIF, Typeface.BOLD);
            case ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.ITALIC);
            case BOLD_ITALIC:
                return Typeface.create(SANS_SERIF, Typeface.BOLD_ITALIC);
            case LIGHT:
                return Typeface.create(SANS_SERIF_LIGHT, Typeface.NORMAL);
            case CONDENSED:
                return Typeface.create(SANS_SERIF_CONDENSED, Typeface.NORMAL);
            case THIN:
                return Typeface.create(SANS_SERIF_MEDIUM, Typeface.NORMAL);
            case MEDIUM:
                return Typeface.create(SANS_SERIF_THIN, Typeface.NORMAL);
            case REGULAR:
            default:
                return Typeface.create(SANS_SERIF, Typeface.NORMAL);
        }
    }
}

ensuite, chaque fois que vous voulez remplacer les polices, vous pouvez simplement appeler la méthode et lui donner une carte de polices de caractères comme suit :

Typeface regular = TypefaceUtil.getTypeface(REGULAR, context);
Typeface light = TypefaceUtil.getTypeface(REGULAR, context);
Typeface condensed = TypefaceUtil.getTypeface(CONDENSED, context);
Typeface thin = TypefaceUtil.getTypeface(THIN, context);
Typeface medium = TypefaceUtil.getTypeface(MEDIUM, context);
Map<String, Typeface> fonts = new HashMap<>();
fonts.put("sans-serif", regular);
fonts.put("sans-serif-light", light);
fonts.put("sans-serif-condensed", condensed);
fonts.put("sans-serif-thin", thin);
fonts.put("sans-serif-medium", medium);
TypefaceUtil.overrideFonts(fonts);

pour un exemple complet vérifier

Cela ne fonctionne que pour Android SDK 21 et plus, pour les versions antérieures, vérifiez l'exemple complet.

4voto

Mohamed Ayed Points 417

Utilisez simplement cette librairie et compilez-la dans votre fichier grade

complie'me.anwarshahriar:calligrapher:1.0'

et l'utiliser dans la méthode onCreate de l'activité principale.

Calligrapher calligrapher = new Calligrapher(this);
calligrapher.setFont(this, "yourCustomFontHere.ttf", true);

C'est le moyen le plus élégant et le plus rapide de le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X