Was entspricht "android: fontFamily =" sans-serif-light "im Java-Code?

106

Meine Frage ist ganz einfach:

In jeder meiner Textansichten verwende ich derzeit das Attribut

android:fontFamily="sans-serif-light"

um einen wunderschönen Look auf Post-HC-Geräten zu bieten.

Leider funktioniert dies nicht mit jedem Widget und für meine Spinner muss ich den Adapter überschreiben.

@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;
    }
}

Gibt es also eine Möglichkeit, mit Code genau das gleiche Ergebnis zu erzielen?

PS: Nein, ich möchte keine Schrift in den Asset-Ordner legen, sondern nur das erste System verwenden.

Waza_Be
quelle

Antworten:

168

Es sollte möglich sein mit setTypeface()und Typeface.create():

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

Siehe Dokumente :

Erstellen Sie ein Schriftobjekt mit einem Familiennamen und Informationen zum Optionsstil. Wenn für den Namen null übergeben wird, wird die "Standard" -Schriftart ausgewählt. Das resultierende Schriftobjekt kann abgefragt werden ( getStyle()), um herauszufinden , welche "echten" Stileigenschaften es hat.

Beachten Sie, dass eine übermäßige Verwendung Typeface.create()schlecht für Ihr Gedächtnis ist, wie in diesem Kommentar angegeben . Die vorgeschlagene Hashtabelle ist eine gute Lösung, aber Sie müssen sie ein wenig ändern, da Sie Ihre Schrift nicht aus einem Asset erstellen.

Saschoar
quelle
2
Bitte achten Sie auf Speicherprobleme, wenn Sie viele Spinner-Artikel haben - ich habe meine Antwort ein wenig aktualisiert.
Saschoar
44

Android 4.1 (API Level 16) und Support Library 26 und höher

Wenn Sie den Ordner res -> font verwenden, können Sie diesen verwenden

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

Meiner Meinung nach gibt es immer noch eine Möglichkeit, Systemschriftarten programmgesteuert auf TextView anzuwenden, ohne dass Speicherprobleme auftreten, und dies unter Verwendung der folgenden textview.setTextAppearanceMethode:

<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);
}
Rahul Verma
quelle
2
android:fontFamilyerfordert API 16.
CoolMind
2
Verwenden Sie TextViewCompat.setTextAppearance(textView, R.style.styleA).
CoolMind
19

Dynamisch können Sie die Schriftfamilie ähnlich wie android: fontFamily in XML festlegen, indem Sie Folgendes verwenden:

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

Dies ist die Liste der verwendeten Standardschriftfamilien . Verwenden Sie diese Liste , indem Sie die doppelte Anführungszeichenfolge "serifenlos" ersetzen.

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" ist die ttf-Datei. Der Pfad befindet sich in src / assets / fonts / mycustomfont.ttf. Weitere Informationen zur Standardschrift finden Sie in dieser Standardschriftfamilie

anand krish
quelle
13

Option 1 - API 26 und höher

// 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 und höher

// Java
Typeface typeface = ResourcesCompat.getFont(context, R.font.myfont);

// Kotlin
val typeface = ResourcesCompat.getFont(context, R.font.myfont)

Überprüfen Sie die vollständige Erklärung im Android Developers Guide .

Bald Santos
quelle
6

Es wäre möglich mit

setTypeface(Typeface tf, int style)Methode der TextViewKlasse.

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

Vikas Gaurav
quelle