269 votes

Android - Utilisation d'une police personnalisée

J'ai appliqué une police personnalisée à un TextView mais cela ne semble pas changer la police de caractères.

Voici mon code :

    Typeface myTypeface = Typeface.createFromAsset(getAssets(), "fonts/myFont.ttf");
    TextView myTextView = (TextView)findViewById(R.id.myTextView);
    myTextView.setTypeface(myTypeface);

Quelqu'un peut-il me sortir de ce problème ?

1 votes

Il y a une erreur dans votre syntaxe, cela devrait être myTextView.setTypeface(myTypeface);

0 votes

Ce sujet est similaire à : stackoverflow.com/a/14558090/693752

0 votes

231voto

Octavian Damiean Points 20620

Sur Mobiletuts+, il y a un très bon tutoriel sur le formatage de texte pour Android. Conseil rapide : Personnaliser les polices de caractères Android

EDIT : Je l'ai testé moi-même maintenant. Voici la solution. Vous pouvez utiliser un sous-dossier appelé fonts mais il doit aller dans le dossier assets et non le dossier res dossier. Ainsi, le dossier

assets/fonts

Assurez-vous également que la fin de la police, c'est-à-dire la fin du fichier de police lui-même, est en minuscules. En d'autres termes, elle ne doit pas être myFont.TTF mais myfont.ttf cette façon de faire doit être en minuscules

0 votes

J'ai modifié ma réponse en y ajoutant la solution.

0 votes

Pourriez-vous m'envoyer un projet de démonstration fonctionnel ? J'ai essayé dans les dossiers assets/fonts/xyz.ttf et assets/xyz.ttf mais cette police n'est pas prise en compte. Elle n'affiche que la police par défaut.

2 votes

Bien sûr, voici le lien vers le projet zippé. dl.dropbox.com/u/8288893/customFont.zip

56voto

javaxian Points 123

Après avoir essayé la plupart des solutions décrites dans ce fil de discussion, j'ai trouvé par hasard Calligraphy ( https://github.com/chrisjenx/Calligraphy ) - une bibliothèque de Christopher Jenkins qui vous permet d'ajouter facilement des polices personnalisées à votre application. Les avantages de cette bibliothèque par rapport aux approches proposées ici sont les suivants :

  1. vous n'avez pas besoin d'introduire votre propre composant TextView surchargé, vous utilisez le TextView intégré
  2. vous pouvez facilement inclure la bibliothèque en utilisant gradle
  3. La bibliothèque ne limite pas votre choix de polices ; il vous suffit d'ajouter vos polices préférées au répertoire des actifs.
  4. vous n'obtenez pas seulement des vues de texte personnalisées - tous les autres contenus Android basés sur du texte seront également affichés en utilisant votre police personnalisée.

1 votes

Qu'est-ce que la taille de cette bibliothèque est une question importante, car elle aura une incidence sur la taille de l'application.

33voto

espinchi Points 1373

Je sais qu'il y a déjà de bonnes réponses, mais voici une mise en œuvre qui fonctionne parfaitement.

Voici l'affichage du texte personnalisé :

package com.mycompany.myapp.widget;

/**
 * Text view with a custom font.
 * <p/>
 * In the XML, use something like {@code customAttrs:customFont="roboto-thin"}. The list of fonts
 * that are currently supported are defined in the enum {@link CustomFont}. Remember to also add
 * {@code xmlns:customAttrs="http://schemas.android.com/apk/res-auto"} in the header.
 */
public class CustomFontTextView extends TextView {

    private static final String sScheme =
            "http://schemas.android.com/apk/res-auto";
    private static final String sAttribute = "customFont";

    static enum CustomFont {
        ROBOTO_THIN("fonts/Roboto-Thin.ttf"),
        ROBOTO_LIGHT("fonts/Roboto-Light.ttf");

        private final String fileName;

        CustomFont(String fileName) {
            this.fileName = fileName;
        }

        static CustomFont fromString(String fontName) {
            return CustomFont.valueOf(fontName.toUpperCase(Locale.US));
        }

        public Typeface asTypeface(Context context) {
            return Typeface.createFromAsset(context.getAssets(), fileName);
        }
    }

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

        if (isInEditMode()) {
            return;
        } else {
            final String fontName = attrs.getAttributeValue(sScheme, sAttribute);

            if (fontName == null) {
                throw new IllegalArgumentException("You must provide \"" + sAttribute + "\" for your text view");
            } else {
                final Typeface customTypeface = CustomFont.fromString(fontName).asTypeface(context);
                setTypeface(customTypeface);
            }
        }
    }
}

Voici les attributs personnalisés. Ils doivent être placés dans votre res/attrs.xml fichier :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CustomFontTextView">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

Et voici comment l'utiliser. J'utiliserai une mise en page relative pour l'envelopper et je montrerai l'élément customAttr mais il peut évidemment s'agir de n'importe quel modèle que vous avez déjà.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:customAttrs="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.mycompany.myapp.widget.CustomFontTextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="foobar"
         customAttrs:customFont="roboto_thin" />

</RelativeLayout>

0 votes

Qu'est-ce que customAttrs dans mon projet ?

0 votes

@Skynet il se réfère à l'espace de noms défini dans votre vue Racine qui est xmlns:customAttrs="http://schemas.android.com/apk/res-auto" . Cela permet d'obtenir automatiquement les attributs définis pour les vues personnalisées. Dans ce cas, vous avez un attribut appelé customFont défini dans le fichier attrs.xml. xmlns:android="http://schemas.android.com/apk/res/android" qui définit l'espace de noms pour vos attributs Android. Donc, si vous changez cela en a alors au lieu de android:text ce serait a:text .

14voto

benvd Points 2795

J'ai déjà utilisé cette méthode avec succès. La seule différence entre nos implémentations est que je n'utilisais pas de sous-dossier dans les actifs. Je ne sais pas si cela changera quelque chose.

14voto

Jelle Fresen Points 567

Pour autant que vous ayez placé la police au bon endroit et qu'il n'y ait pas d'erreur dans le fichier de police lui-même, votre code devrait fonctionner comme cela, RATTLESNAKE.

Cependant, il serait beaucoup plus facile de définir une police dans votre layout xml, comme ceci :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <!-- This text view is styled with the app theme -->
    <com.innovattic.font.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This uses my font in bold italic style" />

    <!-- This text view is styled here and overrides the app theme -->
    <com.innovattic.font.FontTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:flFont="anotherFont"
        android:textStyle="normal"
        android:text="This uses another font in normal style" />

    <!-- This text view is styled with a style and overrides the app theme -->
    <com.innovattic.font.FontTextView
        style="@style/StylishFont"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="This also uses another font in normal style" />

</LinearLayout>

Avec l'accompagnement res/values/styles.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools">

    <!-- Application theme -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <item name="android:textViewStyle">@style/MyTextViewStyle</item>
    </style>

    <!-- Style to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextViewStyle" parent="@android:style/Widget.Holo.Light.TextView">
        <item name="android:textAppearance">@style/MyTextAppearance</item>
    </style>

    <!-- Text appearance to use for ALL text views (including FontTextView) -->
    <!-- Use a different parent if you don't want Holo Light -->
    <style name="MyTextAppearance" parent="@android:style/TextAppearance.Holo">
        <!-- Alternatively, reference this font with the name "aspergit" -->
        <!-- Note that only our own TextView's will use the font attribute -->
        <item name="flFont">someFont</item>
        <item name="android:textStyle">bold|italic</item>
    </style>

    <!-- Alternative style, maybe for some other widget -->
    <style name="StylishFont">
        <item name="flFont">anotherFont</item>
        <item name="android:textStyle">normal</item>
    </style>

</resources>

J'ai créé quelques outils spécialement à cet effet. Se référer à ce projet à partir de GitHub, ou jeter un coup d'œil à ceci article de blog qui explique tout.

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