Ma question est assez simple:
Dans chacune de mes textview, j'utilise actuellement l'attribut
Android:fontFamily="sans-serif-light"
pour donner un look magnifique sur les appareils post HC.
Malheureusement, cela ne fonctionne pas avec tous les widgets et pour mes Spinners, je dois écraser l'adaptateur.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//You can use the new tf here.
if(convertView == null || convertView.getTag() == null) {
// new view - populate
convertView = inflater.inflate(Android.R.layout.simple_spinner_dropdown_item, parent, false);
convertView.setTag(new Object());
}
CheckedTextView spinner_text=(CheckedTextView) convertView.findViewById(Android.R.id.text1);
//Typeface should be set here...
return spinner_text;
}
}
Alors, y a-t-il un moyen d'obtenir exactement le même résultat par code?
PS: Non, je ne veux pas mettre une police de caractères dans un dossier de ressources, je veux simplement utiliser celle du système.
Cela devrait être possible avec setTypeface()
et Typeface.create()
:
convertView.setTypeface(Typeface.create("sans-serif-light", Typeface.NORMAL));
Voir Docs :
Créez un objet typographique à partir d'un nom de famille et d'informations sur les styles d'option. Si null est passé pour le nom, la police "par défaut" sera choisie. Vous pouvez interroger l'objet de police résultant (
getStyle()
) pour en découvrir les "vraies" caractéristiques de style.
Notez que trop utiliser Typeface.create()
est mauvais pour la mémoire, comme indiqué dans ce commentaire . La table de hachage suggérée est une bonne solution, mais vous devez la modifier un peu car vous ne créez pas votre police à partir d'un actif.
Android 4.1 (API niveau 16) et bibliothèque de support technique 26 et plus
Si vous utilisez le dossier res -> font, vous pouvez utiliser comme ceci
val typeface = ResourcesCompat.getFont(Context, R.font.YOUR_FONT)
TextView.setTypeface(typeface)
À mon avis, il existe toujours un moyen d'appliquer les polices système par programme sur TextView sans aucun problème de mémoire et qui utilise textview.setTextAppearance
méthode:
<style name="styleA">
<item name="Android:fontFamily">sans-serif</item>
<item name="Android:textStyle">bold</item>
<item name="Android:textColor">?android:attr/textColorPrimary</item>
</style>
<style name="styleB">
<item name="Android:fontFamily">sans-serif-light</item>
<item name="Android:textStyle">normal</item>
<item name="Android:textColor">?android:attr/textColorTertiary</item>
</style>
if(condition){
textView.setTextAppearance(context,R.style.styleA);
}else{
textView.setTextAppearance(context,R.style.styleB);
}
Dynamiquement, vous pouvez définir une famille de polices semblable à Android: fontFamily en xml en utilisant ceci,
For Custom font:
TextView tv = ((TextView) v.findViewById(R.id.select_item_title));
Typeface face=Typeface.createFromAsset(getAssets(),"fonts/mycustomfont.ttf");
tv.setTypeface(face);
For Default font:
tv.setTypeface(Typeface.create("sans-serif-medium",Typeface.NORMAL));
Voici la liste de la famille utilisée police par défaut, remplacez-la par la chaîne de guillemet double "sans-serif-medium"
FONT FAMILY TTF FILE
1 casual ComingSoon.ttf
2 cursive DancingScript-Regular.ttf
3 monospace DroidSansMono.ttf
4 sans-serif Roboto-Regular.ttf
5 sans-serif-black Roboto-Black.ttf
6 sans-serif-condensed RobotoCondensed-Regular.ttf
7 sans-serif-condensed-light RobotoCondensed-Light.ttf
8 sans-serif-light Roboto-Light.ttf
9 sans-serif-medium Roboto-Medium.ttf
10 sans-serif-smallcaps CarroisGothicSC-Regular.ttf
11 sans-serif-thin Roboto-Thin.ttf
12 serif NotoSerif-Regular.ttf
13 serif-monospace CutiveMono.ttf
"mycustomfont.ttf" est le fichier ttf. Chemin sera dans src/assets/fonts/mycustomfont.ttf, vous pouvez vous référer davantage à la police par défaut dans cette famille de polices par défaut
Option 1 - API 26 et supérieure
// Jave
Typeface typeface = getResources().getFont(R.font.myfont);
textView.setTypeface(typeface);
// Kotlin
val typeface = resources.getFont(R.font.myfont)
textView.typeface = typeface
Option 2 - API 16 et plus
// Java
Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);
// Kotlin
val typeface = ResourcesCompat.getFont(context, R.font.myfont)
Vérifiez l’expiation complète sur Guide du développeur Android .
Ce serait possible en utilisant
setTypeface(Typeface tf, int style)
méthode de TextView
classe.
spinner_text.setTypeface(Typeface.SANS_SERIF,Typeface.NORMAL);