Apa yang setara dengan “android: fontFamily =” sans-serif-light "dalam kode Java?

106

Pertanyaan saya cukup sederhana:

Di setiap textview saya, saya saat ini menggunakan atribut

android:fontFamily="sans-serif-light"

untuk memberikan tampilan cantik pada perangkat pasca HC.

Sayangnya, ini tidak berfungsi dengan setiap widget dan untuk Pemintal saya, saya perlu menimpa Adaptor.

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

Jadi, adakah cara untuk mendapatkan hasil yang persis sama dengan kode?

PS: Tidak, saya tidak mau meletakkan jenis huruf di folder aset, saya hanya ingin menggunakan sistem satu.

Waza_Be
sumber

Jawaban:

169

Ini harus dimungkinkan dengan setTypeface()dan Typeface.create():

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

Lihat Dokumen :

Buat objek tipografi dengan nama keluarga, dan informasi gaya opsi. Jika null dikirimkan untuk nama tersebut, maka font "default" akan dipilih. Objek jenis huruf yang dihasilkan bisa di-queried ( getStyle()) untuk menemukan apa karakteristik gaya "sebenarnya".

Perhatikan bahwa penggunaan yang berlebihan Typeface.create()buruk untuk ingatan Anda, seperti yang dinyatakan dalam komentar ini . The Hashtable disarankan adalah solusi yang baik, tetapi Anda harus memodifikasi sedikit karena Anda tidak membuat jenis huruf Anda dari aset.

saschoar
sumber
2
Berhati-hatilah dengan masalah memori jika Anda memiliki banyak item spinner - Saya sedikit memperbarui jawaban saya.
saschoar
44

Android 4.1 (API Level 16) dan Support Library 26 dan yang lebih tinggi

Jika Anda menggunakan res -> folder font, Anda dapat menggunakan seperti ini

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

Menurut saya, masih ada cara untuk menerapkan font sistem secara programatik pada TextView tanpa masalah memori dan itu menggunakan textview.setTextAppearancemetode:

<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
sumber
2
android:fontFamilymembutuhkan API 16.
CoolMind
2
Gunakan TextViewCompat.setTextAppearance(textView, R.style.styleA).
CoolMind
19

Secara dinamis Anda dapat menyetel fontfamily mirip dengan android: fontFamily di xml dengan menggunakan ini,

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

Ini adalah daftar keluarga fonta default yang digunakan, gunakan salah satu dari ini dengan mengganti string kutipan ganda "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" adalah file ttf. Path akan berada di src / assets / fonts / mycustomfont.ttf , Anda dapat merujuk lebih lanjut tentang font default di keluarga font default ini

anand krish
sumber
13

Opsi 1 - API 26 dan lebih tinggi

// Jave
Typeface typeface = getResources().getFont(R.font.myfont);
textView.setTypeface(typeface);

// Kotlin
val typeface = resources.getFont(R.font.myfont)
textView.typeface = typeface

Opsi 2 - API 16 dan lebih tinggi

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

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

Periksa penebusan penuh di Panduan Pengembang Android .

Segera Santos
sumber
6

Itu dimungkinkan dengan menggunakan

setTypeface(Typeface tf, int style)metode TextViewkelas.

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

Vikas Gaurav
sumber