Quel est l'équivalent de «android: fontFamily =» sans-serif-light »dans le code Java?


106

Ma question est assez simple:

Dans chacune de mes vues de texte, j'utilise actuellement l'attribut

android:fontFamily="sans-serif-light"

pour fournir 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 de police dans le dossier des ressources, je veux juste utiliser le système un.

Réponses:


169

Cela devrait être possible avec setTypeface()et Typeface.create():

convertView.setTypeface(Typeface.create("sans-serif-light", Typeface.NORMAL));

Voir la documentation :

Créez un objet de police avec un nom de famille et des informations de style d'option. Si nul est passé pour le nom, alors la police "par défaut" sera choisie. L'objet police résultant peut être interrogé ( getStyle()) pour découvrir quelles sont ses caractéristiques de style "réelles".

Notez qu'une utilisation excessive Typeface.create()est mauvaise pour votre mémoire, comme indiqué dans ce commentaire . Le Hashtable suggéré est une bonne solution, mais vous devez le modifier un peu car vous ne créez pas votre police à partir d'un actif.


2
Méfiez-vous des problèmes de mémoire si vous avez de nombreux éléments spinner - j'ai mis à jour un peu ma réponse.
saschoar

44

Android 4.1 (niveau d'API 16) et bibliothèque de support 26 et supérieur

Si vous utilisez le dossier res -> font, vous pouvez utiliser comme ceci

  val typeface = ResourcesCompat.getFont(Context, R.font.YOUR_FONT)
  TextView.setTypeface(typeface)

20

À mon avis, il existe toujours un moyen d'appliquer des polices système par programme sur TextView sans avoir de problème de mémoire et qui utilise la textview.setTextAppearancemé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);
}

2
android:fontFamilyrequiert l'API 16.
CoolMind

2
Utilisez TextViewCompat.setTextAppearance(textView, R.style.styleA).
CoolMind

19

Dynamiquement, vous pouvez définir la famille de polices similaire à 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 des familles de polices par défaut utilisées, utilisez n'importe lequel de ces éléments en remplaçant la chaîne de guillemets doubles "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. Le chemin sera dans src / assets / fonts / mycustomfont.ttf , vous pouvez en savoir plus sur la police par défaut dans cette famille de polices par défaut


13

Option 1 - API 26 et plus

// 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)

Consultez l'expiation complète dans le guide des développeurs Android .


6

Ce serait possible en utilisant

setTypeface(Typeface tf, int style)méthode de TextViewclasse.

spinner_text.setTypeface(Typeface.SANS_SERIF,Typeface.NORMAL);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.