115 votes

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

Ma question est très simple :

Dans chacun de mes textviews, j'utilise actuellement l'attribut

android:fontFamily="sans-serif-light"

pour offrir un aspect 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 le dossier des actifs, je veux juste utiliser le système un.

180voto

saschoar Points 2433

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

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

Ver Docs :

Créez un objet de type de caractère en lui donnant un nom de famille et une option de style. informations. Si null est passé pour le nom, alors la police "par défaut" sera choisie. sera choisie. L'objet police de caractères résultant peut être interrogé ( getStyle() ) pour découvrir ses "vraies" caractéristiques stylistiques.

Notez que l'utilisation excessive de Typeface.create() est mauvais pour la mémoire, comme l'indique ce commentaire . Le site suggéré Hashtable est une bonne solution, mais vous devez la modifier un peu puisque vous ne créez pas votre police de caractères à partir d'un actif.

52voto

murgupluoglu Points 631

Android 4.1 (API Level 16) et Support Library 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)

22voto

Rahul Verma Points 1546

À mon avis, il existe toujours un moyen d'appliquer les polices du système de manière programmatique sur les TextView. sans avoir de 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);
}

22voto

anand krish Points 2304

De manière dynamique, vous pouvez définir la famille de caractères 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 police par défaut utilisé, 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. Chemin d'accès sera dans src/assets/fonts/mycustomfont.ttf vous pouvez vous référer à la police par défaut dans ce document. Famille de polices par défaut

14voto

Soon Santos Points 1001

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 sur Guide du développeur Android .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X