Question

J'appliqué une police personnalisée à un TextView, mais il 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 s'il vous plaît sortir de ce problème?

Était-ce utile?

La solution

Sur Mobiletuts + il est très bon tutoriel sur texte pour un Android. Astuce rapide: Personnaliser Android polices

EDIT: Testée moi-même maintenant. Voici la solution. Vous pouvez utiliser un sous-dossier appelé polices, mais il doit aller dans le dossier assets pas le dossier res. Donc,

  

assets / polices

Assurez-vous aussi que la police se terminant je veux dire la fin du fichier de police lui-même est en minuscules. En d'autres termes, il ne devrait pas être myFont.TTF mais myfont.ttf cette façon doit être en minuscules

Autres conseils

Après avoir essayé la plupart des solutions décrites dans ce fil, je accidentellement trouvé la calligraphie ( https://github.com/chrisjenx/Calligraphy) - une bibliothèque par Christopher Jenkins qui vous permet d'ajouter facilement des polices personnalisées à votre application. Les avantages de sa lib comparant aux approches suggérées ici sont:

  1. vous n'avez pas à introduire votre propre composant TextView surchargée, vous utilisez le haut-TextView
  2. vous pouvez facilement inclure la bibliothèque à l'aide gradle
  3. La bibliothèque ne limite pas votre choix de polices; vous ajoutez simplement vos préférés ceux aux actifs dir
  4. vous non seulement obtenir des vues de texte personnalisé -. Tous les autres compontents Android à base de texte seront également affichés en utilisant votre police personnalisée

Je sais qu'il ya de bonnes réponses déjà, mais voici une implémentation fonctionnelle complète.

Voici la vue de 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. Cela devrait aller à votre fichier res/attrs.xml:

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

Et voici comment vous l'utilisez. Je vais utiliser une mise en page par rapport à l'envelopper et de montrer la déclaration de customAttr, mais il pourrait évidemment être tout ce que la mise en page 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>

Je l'ai utilisé auparavant avec succès. La seule différence entre nos implémentations est que je n'utilisais pas un sous-dossier actif. Je ne sais pas si cela va changer quoi que ce soit, cependant.

Sous réserve que vous avez placé la police au bon endroit et il n'y a pas d'erreur dans le fichier de la police lui-même, votre code devrait fonctionner comme ça, le crotale.

Cependant, il serait beaucoup plus facile si vous pouvez simplement définir une police dans votre mise en page 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 le res/values/styles.xml accompagnant:

<?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. Reportez-vous à ce projet de GitHub, ou jeter un oeil à cette Blog post ce qui explique la chose

Pour des polices personnalisées dans Android créer un dossier dans le dossier des actifs nommez « polices » placez votre fonts.ttf ou d'un fichier .otf en elle.

Si vous Prolonge UIBaseFragment:

Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/Arial.ttf");
        tv.setTypeface(font);

else if étend Activité:

Typeface font = Typeface.createFromAsset(getContext().getAssets(), "fonts/Arial.ttf");
        tv.setTypeface(font);

La meilleure façon de le faire à partir préversion Android O est de cette façon:
  Il ne fonctionne que si vous avez android studio 2.4 ou au-dessus

  1. Cliquez droit sur le res dossier et allez à Nouveau> Répertoire des ressources Android . Le Nouveau
    fenêtre Répertoire des ressources apparaît.
  2. Dans la liste des types de ressources, sélectionnez police , puis cliquez sur OK.
  3. Ajouter vos fichiers de polices dans le dossier de police .La structure de dossiers génère ci-dessous R.font.dancing_script, R.font.la_la et R.font.ba_ba.
  4. Double-cliquez sur un fichier de police pour obtenir un aperçu des polices du fichier dans l'éditeur.

Ensuite, nous devons créer une famille de la police:

  1. Cliquez droit sur le dossier de la police et allez à Nouveau> fichier de ressources Font . La fenêtre Nouveau fichier apparaît.
  2. Entrez le Nom de fichier, puis cliquez sur OK . Le nouveau XML des ressources de la police ouvre dans l'éditeur.
  3. Placez chaque fichier de police, le style et l'attribut de poids dans l'élément de balise de police. Le code XML suivant illustre l'ajout d'attributs liés à la police dans le fichier XML des ressources de la police:

             

Ajout de polices à un TextView:

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

de la documentation

  

de travail avec les polices

Toutes les étapes sont correctes.

Vous pouvez utiliser PixlUI https://github.com/neopixl/PixlUI

importer leurs .jar et l'utiliser en XML

 <com.neopixl.pixlui.components.textview.TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    pixlui:typeface="GearedSlab.ttf" />

Depuis que je suis pas satisfait de toutes les solutions présentées sur, je suis venu avec le mien. Il est basé sur un petit truc avec des balises (par exemple, vous ne pouvez pas utiliser des balises dans votre code), je mets le chemin de polices. Ainsi, lors de la définition des vues, vous pouvez effectuer ceci:

<TextView
        android:id="@+id/textViewHello1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 1"
        android:tag="fonts/Oswald-Regular.ttf"/>

ou ceci:

<TextView
        android:id="@+id/textViewHello2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World 2"
        style="@style/OswaldTextAppearance"/>

<style name="OswaldTextAppearance">
        <item name="android:tag">fonts/Oswald-Regular.ttf</item>
        <item name="android:textColor">#000000</item>
</style>

Maintenant, vous pouvez soit explicitement l'accès / configuration de la vue comme:

TextView textView = TextViewHelper.setupTextView(this, R.id.textViewHello1).setText("blah");

ou tout simplement tout réglage via:

TextViewHelper.setupTextViews(this, (ViewGroup) findViewById(R.id.parentLayout)); // parentLayout is the root view group (relative layout in my case)

Et quelle est la classe magique que vous demandez? La plupart du temps collé d'une autre postes de SO, avec des méthodes d'assistance à la fois l'activité et des fragments:

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.HashMap;
import java.util.Map;

public class TextViewHelper {
    private static final Map<String, Typeface> mFontCache = new HashMap<>();

    private static Typeface getTypeface(Context context, String fontPath) {
        Typeface typeface;
        if (mFontCache.containsKey(fontPath)) {
            typeface = mFontCache.get(fontPath);
        } else {
            typeface = Typeface.createFromAsset(context.getAssets(), fontPath);
            mFontCache.put(fontPath, typeface);
        }
        return typeface;
    }

    public static void setupTextViews(Context context, ViewGroup parent) {
        for (int i = parent.getChildCount() - 1; i >= 0; i--) {
            final View child = parent.getChildAt(i);
            if (child instanceof ViewGroup) {
                setupTextViews(context, (ViewGroup) child);
            } else {
                if (child != null) {
                    TextViewHelper.setupTextView(context, child);
                }
            }
        }
    }

    public static void setupTextView(Context context, View view) {
        if (view instanceof TextView) {
            if (view.getTag() != null) // also inherited from TextView's style
            {
                TextView textView = (TextView) view;
                String fontPath = (String) textView.getTag();
                Typeface typeface = getTypeface(context, fontPath);
                if (typeface != null) {
                    textView.setTypeface(typeface);
                }
            }
        }
    }

    public static TextView setupTextView(View rootView, int id) {
        TextView textView = (TextView) rootView.findViewById(id);
        setupTextView(rootView.getContext().getApplicationContext(), textView);
        return textView;
    }

    public static TextView setupTextView(Activity activity, int id) {
        TextView textView = (TextView) activity.findViewById(id);
        setupTextView(activity.getApplicationContext(), textView);
        return textView;
    }
}

Malheureusement, il n'y a pas de bonne solution pour cela.

Je les ai vu de nombreux articles sur l'utilisation d'un TextView personnalisé, mais ce qu'ils oublient, ce que ce ne sont pas seulement textviews qui peuvent mettre en œuvre les polices et il y a des textviews cachés dans d'autres vues inaccessibles au développeur; Je ne vais même pas pour commencer sur Spannable .

Vous pouvez utiliser un utilitaire de police externe comme:

calligraphie police Outil

et Cette boucle sur chaque point de vue dans l'application sur sa création et même cet utilitaire manque quelques points de vue (ViewPager rend la police normale), alors vous avez le problème lorsque Google met à jour leur construire des outils de cette volonté parfois tomber en panne car il a besoin de cibler les propriétés dépréciées. Il est aussi un peu lent car il utilise Java de réflexion .

Il est vraiment à Google pour résoudre ce problème. Nous avons besoin d'un meilleur soutien dans Android police. Si vous regardez la solution d'iOS ils ont littéralement 100 de polices intégrées pour sélectionner. Voulez-vous une police personnalisée? Il suffit de déposer une TFF et il est utilisable ..

Pour l'instant était maintenant limitée à l'offre qui offre Google nous qui est extrêmement limité, mais heureusement mobile optimisé.

Assurez-vous de coller le code ci-dessus dans onCreate () après votre appel au super et l'appel à setContentView (). Ce petit détail a gardé mon suspendu pendant un certain temps.

Android 8.0 en utilisant les polices de caractères personnalisées dans l'application est facile avec downloadable fonts. Nous pouvons ajouter des polices directement à la res/font/ folder dans le dossier du projet, et ce faisant, les polices deviennent automatiquement disponibles dans Android Studio.

set fontFamily attribut à la liste des polices ou cliquez sur plus et sélectionnez la police de votre choix. Ce sera Ajouter une ligne de tools:fontFamily="@font/your_font_file" à votre TextView.

Cela va générer automatiquement quelques fichiers.

1. Dans valeurs dossier, il va créer fonts_certs.xml.

2 Dans Manifest il ajoutera ces lignes.

  <meta-data
            android:name="preloaded_fonts"
            android:resource="@array/preloaded_fonts" /> 

3. preloaded_fonts.xml

<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/open_sans_regular</item>
        <item>@font/open_sans_semibold</item>
    </array>
</resources>

J'ai eu le même problème, la TTF ne se présente pas. J'ai changé le fichier de police, et avec le même code, il fonctionne.

Si vous voulez charger la police à partir du réseau ou facilement le style, vous pouvez utiliser:

https://github.com/shellum/fontView

Exemple:

<!--Layout-->
<com.finalhack.fontview.FontView
        android:id="@+id/someFontIcon"
        android:layout_width="80dp"
        android:layout_height="80dp" />

//Java:
fontView.setupFont("http://blah.com/myfont.ttf", true, character, FontView.ImageType.CIRCLE);
fontView.addForegroundColor(Color.RED);
fontView.addBackgroundColor(Color.WHITE);

Eh bien, après sept ans, vous pouvez changer textView toute l'application ou ce que vous voulez facilement en utilisant les bibliothèques android.support 26 ++.

par exemple:

Créez votre package de polices app / src / res / font et déplacez votre police en elle.

Et dans votre thème app ajouter simplement comme fontFamily:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
   . . . ...
    <item name="android:fontFamily">@font/demo</item>
</style>

Exemple pour une utilisation avec textView seulement:

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

Et ajouter à votre thème principal:

<item name="android:textViewStyle">@style/fontTextView</item>

À l'heure actuelle, il a travaillé sur 8.1 jusqu'à 4.1 Jelly Bean API Et c'est une large gamme.

Mise à jour de réponse: Android 8.0 (niveau de l'API 26) introduit une nouvelle fonctionnalité, les polices de caractères en XML. il suffit d'utiliser les polices fonction XML sur les appareils fonctionnant sous Android 4.1 (niveau API 16) et plus, utiliser la bibliothèque de soutien 26.

voir cette lien


Vieille réponse

Il y a deux façons de personnaliser les polices:

  

!!! ma police personnalisée dans   actifs / polices / iran_sans.ttf


Way 1: Refrection Typeface.class ||| meilleure façon

appel FontsOverride.setDefaultFont () dans la classe étend l'application, ce code entraînera toutes les polices logicielles à modifier, même Toasts polices

AppController.java

public class AppController extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Initial Font
        FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");

    }
}

FontsOverride.java

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


Way 2: utilisation setTypeface

pour une vue spéciale juste de setTypeface appel () pour modifier la police.

CTextView.java

public class CTextView extends TextView {

    public CTextView(Context context) {
        super(context);
        init(context,null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context,attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        // use setTypeface for change font this view
        setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));

    }
}

FontUtils.java

public class FontUtils {

    private static Hashtable<String, Typeface> fontCache = new Hashtable<>();

    public static Typeface getTypeface(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if (tf == null) {
            try {
                tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

}

Vous pouvez utiliser facilement et simple, EasyFonts bibliothèque tierce partie en vue de la variété de la coutume polices à votre TextView. En utilisant cette bibliothèque, vous ne devriez pas avoir à vous soucier de télécharger et d'ajouter des polices dans les actifs / dossier polices. Aussi sur la création d'objets Typeface.

Au lieu de

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

Il suffit de:

TextView myTextView = (TextView)findViewById(R.id.myTextView);
myTextView.setTypeface(EasyFonts.robotoThin(this));

Cette bibliothèque fournit également ci-dessous font face.

  • Roboto
  • Droid Serif
  • Droid Robot
  • La liberté
  • Fun Raiser
  • Android Nation
  • Vert avocat
  • Reconnaissance

La bonne façon de le faire à partir de l'API 26 est décrite dans la documentation officielle ici:

https: // développeur .android.com / Guide / sujets / ui / look-and-feel / fonts-en-xml.html

Il consiste à placer les fichiers TTF res / dossier de police et la création d'un fichier famille de polices.

La solution la plus simple, de prise en charge Android maintenant!

Utiliser la police personnalisée dans xml:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/[your font resource]"/>

Détails Aspect physique:

https: // développeur .android.com / Guide / sujets / ui / look-and-feel / fonts-en-xml.html

  • Ouvrez votre projet et sélectionnez Projet en haut à gauche
  • application -> src -> principale
  • clic droit pour principal et créer le nom du répertoire comme actifs
  • clic droit pour assest et créer un nouveau nom de répertoire, il Polices
  • vous devez trouver des polices gratuites comme polices de caractères gratuit
  • donner à votre Textview et l'appeler dans votre classe d'activité
  • copier vos polices dans le dossier Polices
  • TextView txt = (TextView) findViewById(R.id.txt_act_spalsh_welcome); Typeface font = Typeface.createFromAsset(getAssets(), "fonts/Aramis Italic.ttf"); txt.setTypeface(font);

nom de la police doit être correcte et vous amuser

Oui, les polices téléchargeables sont si faciles, comme Dipali s dit.

Voici comment vous le faites ...

  1. Placez une TextView.
  2. Dans le volet des propriétés, sélectionnez le menu déroulant fontFamily. Si ce n'est pas là, trouver le thingy caret (> et cliquez dessus pour agrandir textAppearance) sous la.
  3. Développez le bas drop font-family.
  4. Dans la petite liste, faites défiler la liste vers le bas jusqu'à ce que vous voyez more fonts
  5. Cela ouvrira une boîte de dialogue où vous pouvez effectuer une recherche à partir Google Fonts
  6. Recherchez la police que vous aimez avec la barre de recherche en haut
  7. Sélectionnez votre police.
  8. Sélectionnez le style de la police que vous aimez (à savoir gras, normal, italique, etc.)
  9. Dans le volet droit, cliquez sur le bouton radio qui dit Add font to project
  10. Cliquez OK. Maintenant, votre TextView a la police que vous aimez!

BONUS: Si vous souhaitez un style tout avec du texte dans votre application avec la police choisie, ajoutez simplement <item name="android:fontfamily">@font/fontnamehere</item> dans votre styles.xml

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top