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/

326voto

tomrozb Points 2238

La réponse est oui.

Lumière globale Roboto pour TextView y Button classes :

<style name="AppTheme" parent="AppBaseTheme">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="android:buttonStyle">@style/RobotoButtonStyle</item>
</style>

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

<style name="RobotoButtonStyle" parent="android:Widget.Holo.Button">
    <item name="android:fontFamily">sans-serif-light</item>
</style>

Il suffit de sélectionner le style que vous voulez dans la liste thèmes.xml puis créez votre style personnalisé en vous basant sur le style original. À la fin, appliquez le style comme thème de l'application.

<application
    android:theme="@style/AppTheme" >
</application>

Il ne fonctionnera qu'avec des polices intégrées comme Roboto, mais c'était la question. Pour les polices personnalisées (chargées à partir d'actifs par exemple), cette méthode ne fonctionnera pas.

EDIT 08/13/15

Si vous utilisez des thèmes AppCompat, n'oubliez pas de supprimer android: préfixe. Par exemple :

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:textViewStyle">@style/RobotoTextViewStyle</item>
    <item name="buttonStyle">@style/RobotoButtonStyle</item>
</style>

Notez le buttonStyle ne contient pas android: préfixe, mais textViewStyle doit le contenir.

5 votes

Où avez-vous trouvé le sans-serif-light de la valeur ? Existe-t-il une liste de valeurs valables pour fontFamily quelque part ? J'ai parcouru la documentation, ainsi que les fichiers de thème et de style dans les sources d'Android, mais je n'ai rien trouvé.

0 votes

De cette réponse : stackoverflow.com/questions/12128331/ EDIT : Mais maintenant je vois que vous avez posté le même commentaire là ;)

36 votes

Ceci n'est possible que pour le niveau 16 de l'API. le nom "Android:fontFamily" n'existe que dans le niveau 16 ou supérieur. existe-t-il un moyen de le faire également pour l'API 14 par exemple ?

206voto

João Magalhães Points 1410

Avec la sortie d'Android Oreo, vous pouvez utiliser la bibliothèque de support pour atteindre cet objectif.

  1. Enregistrez votre application build.gradle si vous disposez de la bibliothèque de soutien >= 26.0.0
  2. Ajouter " police "dans votre dossier de ressources et ajoutez-y vos polices.
  3. Faites référence à votre famille de polices par défaut dans le style principal de votre application :

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
       <item name="android:fontFamily">@font/your_font</item>
       <item name="fontFamily">@font/your_font</item> <!-- target android sdk versions < 26 and > 14 if theme other than AppCompat -->
    </style>

Vérifiez https://developer.Android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html pour des informations plus détaillées.

66voto

guy Points 972

Pour changer la police de votre application, suivez les étapes suivantes :

  1. À l'intérieur de res créer un nouveau répertoire et le nommer font .
  2. Insérez votre police .ttf/.otf dans le dossier des polices. Assurez-vous que le nom de la police est composé de lettres minuscules et de traits de soulignement uniquement.
  3. À l'intérieur de res -> values -> styles.xml à l'intérieur de <resources> -> <style> ajoutez votre police <item name="android:fontFamily">@font/font_name</item> .

enter image description here

Maintenant, tout le texte de votre application devrait être dans la police que vous avez ajoutée.

42voto

AndroidGecko Points 2216

Vous pouvez utiliser Calligraphy pour gérer les polices avec Android.

https://github.com/chrisjenx/Calligraphy

34voto

longilong Points 2173

LIRE LES MISES À JOUR CI-DESSOUS

J'ai eu le même problème avec l'intégration d'une nouvelle police et j'ai finalement réussi à la faire fonctionner en étendant le TextView et en définissant la police de caractères à l'intérieur.

public class YourTextView extends TextView {

    public YourTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public YourTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public YourTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        Typeface tf = Typeface.createFromAsset(context.getAssets(),
            "fonts/helveticaneue.ttf");
        setTypeface(tf);
    }
}

Vous devez changer les éléments TextView plus tard à de à dans chaque élément. Et si vous utilisez le UI-Creator dans Eclipse, parfois il ne montre pas les TextViews correctement. C'était la seule chose qui fonctionnait pour moi...

UPDATE

Aujourd'hui, j'utilise la réflexion pour changer les polices de caractères dans toute l'application sans étendre les TextViews. Consultez ce billet de SO

MISE À JOUR 2

À partir du niveau 26 de l'API, disponible dans la bibliothèque d'assistance, vous pouvez utiliser les fonctions suivantes

android:fontFamily="@font/embeddedfont"

Pour plus d'informations : Polices de caractères en XML

32 votes

Ce n'est pas la solution. J'utilise de nombreuses vues différentes, pas seulement le TextView. Je veux définir la police une fois et l'oublier. En outre, votre code crée un nouvel objet pour chaque TextView. Au moins, déclarez le champ comme statique pour charger la police à partir des actifs une fois.

2 votes

...eh bien, il existe une fonction de recherche et de remplacement, qui fonctionne très bien dans ce cas.

1 votes

Ça ne va pas marcher. Vous ne pouvez pas appeler getContext() lorsque la variable est statique. Vous devriez l'implémenter comme un singleton, sinon le code actuel ne sera même pas compilé.

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