J'ai ajouté un fichier de polices personnalisé à mon dossier assets / fonts. Comment l'utiliser à partir de mon XML?
Je peux l'utiliser à partir du code comme suit:
TextView text = (TextView) findViewById(R.id.textview03);
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf");
text.setTypeface(tf);
Ne puis-je pas le faire à partir de XML en utilisant un android:typeface="/fonts/Molot.otf"
attribut?
Réponses:
Réponse courte: Non. Android ne prend pas en charge l'application de polices personnalisées aux widgets de texte via XML.
Cependant, il existe une solution de contournement qui n'est pas très difficile à mettre en œuvre.
Première
Vous devrez définir votre propre style. Dans votre dossier / res / values, ouvrez / créez le fichier attrs.xml et ajoutez un objet pouvant être déclaré comme suit:
Seconde
En supposant que vous souhaitiez utiliser souvent ce widget, vous devez configurer un cache simple pour les
Typeface
objets chargés , car les charger à partir de la mémoire à la volée peut prendre du temps. Quelque chose comme:Celui-ci vous permettra d'utiliser les extensions de fichier .ttc, mais il n'a pas été testé.
Troisième
Créez une nouvelle classe qui sous-classe
TextView
. Cet exemple particulier tient compte de la police de caractères XML défini (bold
,italic
, etc.) et l' appliquer à la police ( en supposant que vous utilisez un fichier .ttc).finalement
Remplacez les instances de
TextView
dans votre XML par le nom de classe complet. Déclarez votre espace de noms personnalisé comme vous le feriez pour l'espace de noms Android. Notez que "typefaceAsset" doit pointer vers un fichier .ttf ou .ttc contenu dans votre répertoire / assets.la source
Voici un exemple de code qui fait cela. J'ai la police définie dans une variable finale statique et le fichier de police est dans le répertoire des actifs.
la source
Créez votre TextView personnalisé appartenant à la police que vous souhaitez utiliser. Dans cette classe, j'utilise un champ statique mTypeface pour mettre en cache la police (pour de meilleures performances)
Dans un fichier xml:
En classe java:
la source
Activity implémente LayoutInflater.Factory2 qui fournit des rappels sur chaque vue créée. Il est possible de styliser le TextView avec l'attribut Famille de polices personnalisées, de charger les polices à la demande et d'appeler automatiquement setTypeface sur les vues de texte instanciées.
Malheureusement, en raison de la relation architecturale des instances d'Inflater par rapport aux activités et à Windows, l'approche la plus simple pour utiliser des polices personnalisées dans Android consiste à mettre en cache les polices chargées au niveau de l'application.
L'exemple de base de code est ici:
https://github.com/leok7v/android-textview-custom-fonts
résulte en
la source
Pas une bonne idée d'utiliser des polices personnalisées en XML en raison de ce fait qui est, vous devez le faire par programme pour éviter la fuite de mémoire!
la source
Peut-être pouvez-vous utiliser la réflexion pour injecter / pirater votre police dans la liste statique des polices disponibles lorsque votre application est créée? Je suis intéressé par les commentaires des autres si c'est une très, très mauvaise idée ou si c'est une excellente solution - il semble que ce sera l'un de ces extrêmes ...
J'ai pu injecter ma police de caractères personnalisée dans la liste des polices système avec mon propre nom de famille de polices, puis en spécifiant ce nom de famille de polices personnalisé ("brush-script") comme valeur d' android: FontFamily sur un TextView standard fonctionnait sur mon LG G4 sous Android 6.0.
Dans ma mise en page
la source
MyApplication
classe doit-elle être appelée?et ajoutez un déclarable dans attrs.xml
puis ajoutez votre customFont comme
la source
Je sais que c'est une vieille question, mais j'ai trouvé une solution beaucoup plus simple.
Déclarez d'abord votre TextView en xml comme d'habitude. Mettez votre police (TTF ou TTC) dans le dossier des ressources
Ensuite, définissez simplement la police de caractères de votre vue texte dans votre méthode onCreate.
Terminé.
la source
La meilleure solution est d'utiliser (enfin) introduit par Google une fonctionnalité de police personnalisée native en XML. Mais vous devez cibler l'API 26. Il prend en charge l'API 16+
https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml
la source
au lieu de xmlns: custom = "schemas.android.com/tools"; vous devez utiliser: xmlns: custom = "schemas.android.com/apk/res-auto"; afin d'utiliser des attributs stylables. J'ai fait ce changement et cela fonctionne maintenant.
la source