Je souhaite utiliser une police personnalisée pour mon application Android que je crée.
Je peux modifier individuellement la police de caractères de chaque objet à partir de Code, mais j'en ai des centaines.
Alors,
- Existe-t-il un moyen de le faire à partir du XML? [Définition d'une police de caractères personnalisée]
- Existe-t-il un moyen de le faire à partir du code en un seul endroit, de dire que toute l'application et tous les composants doivent utiliser la police de caractères personnalisée au lieu de celle par défaut?
Réponses:
Non désolé. Vous ne pouvez spécifier les polices intégrées que via XML.Pas que je sache.Il existe aujourd'hui une variété d'options pour ces derniers:
Ressources de polices et rétroportages dans le SDK Android, si vous utilisez
appcompat
Bibliothèques tierces pour ceux qui n'utilisent pas
appcompat
, bien que toutes ne prennent pas en charge la définition de la police dans les ressources de mise en pagela source
Oui c'est possible.
Vous devez créer une vue personnalisée qui étend la vue du texte.
Dans
attrs.xml
dans levalues
dossier:Dans
main.xml
:Dans
MyTextView.java
:la source
TextView
. Cela nécessitera des sous-classes personnalisées pour chaque classe de widget qui hérite de l'TextView
endroit où la même capacité est souhaitée.Je l'ai fait d'une manière plus "brute force" qui ne nécessite pas de modifications du format xml ou des activités.
Testé sur la version Android 2.1 à 4.4. Exécutez ceci au démarrage de l'application, dans votre classe Application:
Pour un exemple plus complet, voir http://github.com/perchrh/FontOverrideExample
la source
code
<style name = "AppTheme" parent = "AppBaseTheme"> <item name = "android: typeface"> monospace </item> </style>code
cela fonctionne mais pas pour le gras. j'ai ajouté ce code dans une classe qui étend l'application. est-ce le bon endroit? @ P-chanBien que j'évalue la réponse de Manish comme la méthode la plus rapide et la plus ciblée, j'ai également vu des solutions naïves qui ne font qu'itérer récursivement dans une hiérarchie de vues et mettre à jour les polices de caractères de tous les éléments à leur tour. Quelque chose comme ça:
Vous devrez appeler cette fonction sur vos vues à la fois après avoir gonflé la mise en page et dans les
onContentChanged()
méthodes de votre activité .la source
J'ai pu le faire de manière centralisée, voici le résultat:
J'ai suivi
Activity
et j'en étend si j'ai besoin de polices personnalisées:Mais si j'utilise une activité du support package, par exemple,
FragmentActivity
j'utilise ceciActivity
:Je n'ai pas encore testé ce code avec
Fragment
s, mais j'espère que cela fonctionnera.My
FontUtils
est simple, ce qui résout également le problème pré-ICS mentionné ici https://code.google.com/p/android/issues/detail?id=9904 :la source
Hé, j'ai également besoin de 2 polices différentes dans mon application pour différents widgeds! J'utilise de cette façon:
Dans ma classe Application, je crée une méthode statique:
La police String représente le xyz.ttf dans le dossier des ressources. (J'ai créé une classe de constantes) Vous pouvez maintenant l'utiliser partout dans votre application:
Le seul problème est que vous en avez besoin pour chaque widget où vous souhaitez utiliser la police! Mais je pense que c'est le meilleur moyen.
la source
Utiliser la suggestion de pospi et travailler avec la propriété 'tag' comme Richard fait, j'ai créé une classe personnalisée qui charge mes polices personnalisées et les applique aux vues en fonction de leurs balises.
Donc, fondamentalement, au lieu de définir TypeFace dans l'attribut android: fontFamily, vous utilisez android: tag attritube et définissez-le sur l'une des énumérations définies.
Dans votre activité ou fragment, vous venez d'appeler
la source
J'ai trouvé une belle solution sur le blog de Lisa Wray . Avec la nouvelle liaison de données, il est possible de définir la police dans vos fichiers XML.
En XML:
la source
Je pense qu'il peut y avoir un moyen plus pratique de le faire. La classe suivante définira un visage de type personnalisé pour tous vos composants de votre application (avec un paramètre par classe).
la source
Les implémentations par défaut de LayoutInflater ne prennent pas en charge la spécification de la police de caractères à partir de xml. Je l'ai cependant vu faire en xml en fournissant une usine personnalisée pour le LayoutInflater qui analysera ces attributs à partir de la balise xml.
La structure de base aimerait cela.
Cet article fournit une explication plus approfondie de ces mécanismes et de la manière dont l'auteur tente de fournir une prise en charge de la mise en page XML pour les polices de cette manière. Le code de l'implémentation de l'auteur peut être trouvé ici .
la source
Définition d'une police personnalisée sur un ProgressDialog / AlertDialog normal:
la source
Oui, c'est possible en remplaçant la police par défaut. J'ai suivi cette solution et cela a fonctionné comme un charme pour tous les textes TextViews et ActionBar avec un seul changement.
styles.xml
Au lieu de themes.xml comme mentionné dans le lien ci-dessus, j'ai mentionné la police par défaut à remplacer dans mon styles.xml dans ma balise de thème d'application par défaut. Les polices par défaut qui peuvent être écrasées sont serif, sans, monospace et normal.
TypefaceUtil.java
Au départ, je ne savais pas que les polices à écraser étaient fixes et constituaient un ensemble de valeurs définies, mais cela m'a finalement aidé à comprendre comment Android traite les polices et les polices et leurs valeurs par défaut, ce qui est bien sûr un point différent.
la source
Je ne sais pas si cela change l'ensemble de l'application, mais j'ai réussi à changer certains composants qui ne pourraient autrement pas être modifiés en faisant ceci:
la source
J'aime la suggestion de pospi. Pourquoi ne pas utiliser à fond la propriété 'tag' d'une vue (que vous pouvez spécifier en XML - 'android: tag') pour spécifier tout style supplémentaire que vous ne pouvez pas faire en XML. J'aime JSON, donc j'utiliserais une chaîne JSON pour spécifier un ensemble clé / valeur. Cette classe fait le travail - appelez simplement
Style.setContentView(this, [resource id])
votre activité.De toute évidence, vous voudrez gérer plus que la simple police de caractères pour rendre l'utilisation de JSON intéressante.
Un avantage de la propriété 'tag' est que vous pouvez la définir sur un style de base que vous utilisez comme thème et ainsi l'appliquer automatiquement à toutes vos vues. EDIT: Cela entraîne un crash pendant l'inflation sur Android 4.0.3. Vous pouvez toujours utiliser un style et l'appliquer individuellement aux vues de texte.
Une chose que vous verrez dans le code - certaines vues ont une balise sans qu'aucune ne soit explicitement définie - bizarrement, c'est la chaîne 'Αποκοπή' - qui est 'cut' en grec, selon google translate! Que se passe-t-il...?
la source
La réponse de @ majinboo est révisée pour les performances et la gestion de la mémoire. Toute activité associée à plus d'une police a besoin de cette classe Font en donnant le constructeur lui-même comme paramètre.
La classe de polices révisée est la suivante:
la source
Travailler pour Xamarin.Android:
Classe:
Implémentation de l'application:
Style:
la source
Il semble que l'utilisation de polices personnalisées a été facilitée avec Android O, vous pouvez essentiellement utiliser xml pour y parvenir. J'ai joint un lien vers la documentation officielle d'Android pour référence, et j'espère que cela aidera les personnes qui ont encore besoin de cette solution. Travailler avec des polices personnalisées sous Android
la source
Il peut être utile de savoir qu'à partir d'Android 8.0 (niveau d'API 26), vous pouvez utiliser une police personnalisée en XML .
En termes simples, vous pouvez le faire de la manière suivante.
Mettez la police dans le dossier
res/font
.Soit l'utiliser dans l'attribut d'un widget
<Button android:fontFamily="@font/myfont"/>
ou mettez-le dans
res/values/styles.xml
et utilisez-le comme style
la source
Utilisez l'attribut "fontPath" directement dans le fichier xml.
à utiliser dans style.xml
<item name = "fontPath"> fonts / ProximaNovaSemibold.ttf </item>
à utiliser dans un fichier de mise en page directe
fontPath = "fonts / ProximaNovaBold.ttf"
(Remarque: pas besoin d'utiliser l'attribut app / android dans le préfixe)
la source
Absolument possible. De nombreuses façons de le faire. Le moyen le plus rapide, créez une condition avec la méthode try-catch .. essayez votre condition de style de police, détectez l'erreur et définissez l'autre style de police.
la source