web-dev-qa-db-fra.com

Quel est l'équivalent de "Android: fontFamily =" sans-serif-light "dans Java?)?

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.

87
Waza_Be

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.

149
saschoar

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)
26
murgupluoglu

À 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);
}
16
Rahul Verma

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

10
anand krish

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 .

6
Soon Santos

Ce serait possible en utilisant

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

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

6
Vikas Gaurav