Fon khusus dan tata letak XML (Android)

174

Saya mencoba mendefinisikan tata letak GUI menggunakan file XML di Android. Sejauh yang saya tahu, tidak ada cara untuk menentukan bahwa widget Anda harus menggunakan font khusus (misalnya yang Anda tempatkan di aset / font /) dalam file XML dan Anda hanya dapat menggunakan font yang diinstal sistem.

Saya tahu bahwa, dalam kode Java, saya dapat mengubah font setiap widget secara manual menggunakan ID unik. Atau, saya bisa mengulangi semua widget di Jawa untuk melakukan perubahan ini, tetapi ini mungkin akan sangat lambat.

Opsi apa lagi yang saya miliki? Apakah ada cara yang lebih baik untuk membuat widget yang memiliki tampilan khusus? Saya khususnya tidak ingin harus mengubah font secara manual untuk setiap widget baru yang saya tambahkan.

DrDefrost
sumber
68
DrDefrost - terima beberapa jawaban, Anda akan mendapat lebih banyak tanggapan di situs ini
SK9
1
Berikut satu pertanyaan serupa: stackoverflow.com/questions/9030204/…
Vins
Diperbarui 05/2017: "Perpustakaan Dukungan 26.0 Beta menyediakan dukungan untuk fitur Fonts dalam XML pada perangkat yang menjalankan Android API versi 14 dan lebih tinggi." Lihat: developer.android.com/preview/features/…
albert c braun

Jawaban:

220

Anda dapat memperluas TextView untuk mengatur font khusus seperti yang saya pelajari di sini .

TextViewPlus.java:

package com.example;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.TextView;

public class TextViewPlus extends TextView {
    private static final String TAG = "TextView";

    public TextViewPlus(Context context) {
        super(context);
    }

    public TextViewPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(context, attrs);
    }

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(context, attrs);
    }

    private void setCustomFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);
        String customFont = a.getString(R.styleable.TextViewPlus_customFont);
        setCustomFont(ctx, customFont);
        a.recycle();
    }

    public boolean setCustomFont(Context ctx, String asset) {
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  
        } catch (Exception e) {
            Log.e(TAG, "Could not get typeface: "+e.getMessage());
            return false;
        }

        setTypeface(tf);  
        return true;
    }

}

attrs.xml: (dalam resolusi / nilai)

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TextViewPlus">
        <attr name="customFont" format="string"/>
    </declare-styleable>
</resources>

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:foo="http://schemas.android.com/apk/res/com.example"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.example.TextViewPlus
        android:id="@+id/textViewPlus1"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:text="@string/showingOffTheNewTypeface"
        foo:customFont="saxmono.ttf">
    </com.example.TextViewPlus>
</LinearLayout>

Anda akan memasukkan "saxmono.ttf" di folder aset .

PEMBARUAN 8/1/13

Ada masalah memori serius dengan metode ini. Lihat komentar chedabob di bawah ini.

Peter
sumber
5
Itu terlihat bagus, namun, saya mendapatkan kesalahan ketika saya mencoba menggunakan "TextViewPlus" di main.xml. Saya mendapatkan yang berikut: - kesalahan: Kesalahan parsing XML: awalan tidak terikat - Awalan "foo" untuk atribut "foo: customFont" yang terkait dengan jenis elemen "supportLibs.TextViewPlus" tidak terikat.
Majjoodi
79
Satu hal yang perlu diperhatikan adalah ini akan menghasilkan lusinan objek TypeFace dan memakan memori. Ada bug di Android pra-4.0 yang tidak membebaskan TypeFaces dengan benar. Hal termudah untuk dilakukan adalah membuat cache TypeFace dengan HashMap. Ini menurunkan penggunaan memori di aplikasi saya dari 120+ mb ke 18mb. code.google.com/p/android/issues/detail?id=9904
chedabob
7
@ Majjoodi: Itu biasanya terjadi jika Anda lupa menambahkan namespace ke-2 ke tata letak Anda:xmlns:foo="http://schemas.android.com/apk/res/com.example
Theo
11
SANGAT PENTING - Saya hanya ingin melipatgandakan nasihat chedabob. Kecuali Anda mengikutinya, Anda akan memiliki kebocoran memori di pra-ICS. Ada beberapa solusi, salah satunya ada di tautan yang disediakan oleh chedabob, yang lain ada di sini: stackoverflow.com/questions/8057010/listview-memory-leak . peter - harap perbarui jawaban Anda - ini bagus tapi tidak lengkap
Michał K
1
Bagaimana cara mengatur atribut khusus ini di styles.xml selain atribut textview lainnya seperti lebar dan tinggi?
loeschg
35

Saya terlambat 3 tahun untuk pesta :( Namun ini bisa berguna bagi seseorang yang mungkin menemukan posting ini.

Saya telah menulis perpustakaan yang menyimpan cache Typefaces dan juga memungkinkan Anda untuk menentukan tipografi khusus langsung dari XML. Anda dapat menemukan perpustakaan di sini .

Berikut ini tampilan tata letak XML Anda, saat Anda menggunakannya.

<com.mobsandgeeks.ui.TypefaceTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"
    geekui:customTypeface="fonts/custom_font.ttf" />
Ragunath Jawahar
sumber
Hai @ Ragunath-jawahar, bagaimana saya mengimpor perpustakaan untuk proyek gradle? Saya mencoba compile 'com.mobsandgeeks:android-typeface-textview:1.0'tetapi itu tidak berhasil.
aimango
1
Anda akan membutuhkan AAR untuk dapat menggunakannya dengan cara itu. Itu belum ada di sana. Anda dapat menyalin sumber dan membangun proyek Perpustakaan Android Studio untuk saat ini.
Ragunath Jawahar
2
dari mana dosis tag geekui Anda berasal?
sefirosu
3
Dari namespace yang ditentukan dalam tag induk -xmlns:geekui="http://schemas.android.com/apk/res-auto"
Ragunath Jawahar
1
@MuhammedRefaat, ya ya :)
Ragunath Jawahar
18

Ini mungkin agak terlambat, tetapi Anda perlu membuat kelas tunggal yang mengembalikan jenis huruf kustom untuk menghindari kebocoran memori.

Kelas TypeFace:

public class OpenSans {

private static OpenSans instance;
private static Typeface typeface;

public static OpenSans getInstance(Context context) {
    synchronized (OpenSans.class) {
        if (instance == null) {
            instance = new OpenSans();
            typeface = Typeface.createFromAsset(context.getResources().getAssets(), "open_sans.ttf");
        }
        return instance;
    }
}

public Typeface getTypeFace() {
    return typeface;
}
}

Tampilan Teks Khusus:

public class NativelyCustomTextView extends TextView {

    public NativelyCustomTextView(Context context) {
        super(context);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

    public NativelyCustomTextView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        setTypeface(OpenSans.getInstance(context).getTypeFace());
    }

}

Dengan xml:

<com.yourpackage.views.NativelyCustomTextView
            android:id="@+id/natively_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_margin="20dp"
            android:text="@string/natively"
            android:textSize="30sp" /> 

Secara terprogram:

TextView programmaticallyTextView = (TextView) 
       findViewById(R.id.programmatically_text_view);

programmaticallyTextView.setTypeface(OpenSans.getInstance(this)
                .getTypeFace());
Leonardo Cardoso
sumber
Tampaknya bekerja pada saat runtime, tetapi apakah itu seharusnya bekerja pada perancang juga?
Magnus Johansson
Tentu. Anda dapat menggunakan sebagai xml. @Magnus
Leonardo Cardoso
Saya pikir Anda salah paham, sepertinya tidak berfungsi di waktu Desain (pratinjau desainer). (xml! = desainer). Ini berfungsi dengan baik ditentukan dalam file layout Xml dikompilasi menjadi runtime. Lagi pula, saya menggunakan ekstensi ini github.com/danh32/Fontify , yang berfungsi lebih baik untuk kebutuhan saya (mendukung berbagai gaya font, reguler, tebal, dll. Serta nama font yang berbeda serta kontrol lain di luar TextView)
Magnus Johansson
2
GetTypeFace menciptakan jenis huruf baru pada setiap panggilan ... ini mengalahkan tujuan singleton. Itu harus memiliki bidang statis yang diatur saat pertama kali panggilan dibuat dan mengembalikan nilai bidang pada panggilan berikutnya.
Steven Pena
1
@chiwai kamu benar! Tentang pertanyaan pertama itu tidak membutuhkannya. Tentang yang kedua itu salah cetak.
Leonardo Cardoso
13

Pertanyaan lama, tapi saya harap saya membaca jawaban ini di sini sebelum saya memulai pencarian saya sendiri untuk solusi yang baik. Kaligrafi memperluas android:fontFamilyatribut untuk menambahkan dukungan untuk font khusus di folder aset Anda, seperti:

<TextView 
  android:text="@string/hello_world"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:fontFamily="fonts/Roboto-Bold.ttf"/>

Satu-satunya hal yang harus Anda lakukan untuk mengaktifkannya adalah melampirkannya pada Konteks Aktivitas yang Anda gunakan:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

Anda juga dapat menentukan atribut khusus Anda sendiri untuk diganti android:fontFamily

Ini juga berfungsi dalam tema, termasuk AppTheme.

pemalas
sumber
8

Menggunakan DataBinding :

@BindingAdapter({"bind:font"})
public static void setFont(TextView textView, String fontName){
 textView.setTypeface(Typeface.createFromAsset(textView.getContext().getAssets(), "fonts/" + fontName));
}

Dalam XML:

<TextView
app:font="@{`Source-Sans-Pro-Regular.ttf`}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

file font harus dalam assets/fonts/

Chulo
sumber
7

Jika Anda hanya memiliki satu jenis huruf yang ingin Anda tambahkan, dan ingin lebih sedikit kode untuk ditulis, Anda dapat membuat TextView khusus untuk font spesifik Anda. Lihat kode di bawah ini.

package com.yourpackage;
import android.content.Context;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {
    public static Typeface FONT_NAME;


    public FontTextView(Context context) {
        super(context);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        if(FONT_NAME == null) FONT_NAME = Typeface.createFromAsset(context.getAssets(), "fonts/FontName.otf");
        this.setTypeface(FONT_NAME);
    }
}

Di main.xml, Anda sekarang dapat menambahkan textView Anda seperti ini:

<com.yourpackage.FontTextView
    android:id="@+id/tvTimer"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="" />
Tore Rudberg
sumber
lakukan ini di init () dan simpan sendiri 3x panggilan yang sama.
ericosg
@ericosg saya mendapatkan kesalahan ini ketika saya menggunakan solusi ini android.view.InflateException: Binary XML file line # 9: Kesalahan membesarkan kelas com.ascent.adwad.utils.CustomTextView
Sagar Devanga
@SagarDevanga, sulit untuk membantu tanpa informasi lebih lanjut. Mungkin bawa sejauh yang Anda bisa dan buat pertanyaan baru.
ericosg
7

Cara terbaik untuk melakukannya Dari rilis pratinjau Android O adalah dengan cara ini
1.) Klik kanan folder res dan buka New> Android resource directory . Jendela New
Resource Directory muncul.
2.) Di daftar Tipe sumber daya, pilih font , lalu klik OK.
3.) Tambahkan file font Anda di folder font . Struktur folder di bawah ini menghasilkan R.font.dancing_script, R.font.la_la, dan R.font.ba_ba.
4.) Klik dua kali file font untuk melihat dulu font file dalam editor.

Selanjutnya kita harus membuat keluarga font

1.) Klik kanan folder font dan pergi ke New> File sumber daya font . Jendela File Sumber Daya Baru muncul.
2.) Masukkan nama file, lalu klik OK . Sumber daya font baru XML terbuka di editor.
3.) Lampirkan setiap file font, style, dan atribut weight dalam elemen tag font. XML berikut ini mengilustrasikan penambahan atribut terkait font di XML sumber daya font:

<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
    android:fontStyle="normal"
    android:fontWeight="400"
    android:font="@font/hey_regular" />
    <font
    android:fontStyle="italic"
    android:fontWeight="400"
    android:font="@font/hey_bababa" />
</font-family>

Menambahkan font ke TextView:

   <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    **android:fontFamily="@font/ba_ba"**/>

Seperti dari dokumentasi

Bekerja dengan Font

semua langkah sudah benar.

Ya ampun s
sumber
1
Jawaban terbaik! Nama file font harus dalam huruf kecil.
Dmitry
Anda juga dapat membuat gaya kustom yang Anda terapkan ke aplikasi Anda (di bawah file AndroidManifest) dan itu akan diberikan kepada SEMUA tampilan. Alih-alih misalnya hanya menempatkannya di satu TextView, karena ini tidak akan memengaruhi Toolbar.
goldenmaza
5

Perluas TextViewdan berikan atribut khusus atau gunakan saja atribut android: tag untuk meneruskan String dari font apa yang ingin Anda gunakan. Anda harus memilih konvensi dan tetap menggunakannya seperti saya akan meletakkan semua font saya di folder res / assets / fonts / sehingga kelas TextView Anda tahu di mana menemukannya. Kemudian di konstruktor Anda, Anda cukup mengatur font secara manual setelah panggilan super.

Nathan Schwermann
sumber
4

Satu-satunya cara untuk menggunakan font khusus adalah melalui kode sumber.

Ingat saja bahwa Android berjalan pada perangkat dengan sumber daya dan font yang sangat terbatas mungkin memerlukan jumlah RAM yang baik. Font Droid bawaan dibuat secara khusus dan, jika Anda perhatikan, ada banyak karakter dan dekorasi yang hilang.

Tareq Sha
sumber
"Ingatlah bahwa Android berjalan pada perangkat dengan sumber daya yang sangat terbatas" -> ini menjadi semakin berkurang. Ponsel quad core? Betulkah??
Sandy
9
Saya akan melakukan lebih banyak untuk menunjukkan pertimbangan konteks jawaban tareqHs, yang mendahului komentar Anda selama 2 setengah tahun.
SK9
Bagian pertama dari respons Anda mungkin benar ketika Anda menulis jawaban Anda pada tahun 2010. Yang terakhir adalah superfluoys dan di samping itu: Droid buruk, dibuang oleh Google pada 2012 mendukung Roboto. Kurangnya pilihan dalam tipografi di Android adalah cacat, bukan fitur; iOS telah memiliki banyak font yang tersedia untuk pengembang sejak 2008 di bawah perangkat primitif menurut standar saat ini.
cosmix
Jawaban ini tidak lagi valid.
Martin Konecny
2

Saya mungkin punya jawaban sederhana untuk pertanyaan tanpa memperpanjang TextView dan mengimplementasikan kode panjang.

Kode:

 TextView tv = (TextView) findViewById(R.id.textview1);
    tv.setTypeface(Typeface.createFromAsset(getAssets(), "font.ttf"));

Tempatkan file font khusus di folder aset seperti biasa dan coba ini. Ini bekerja untuk saya. Saya hanya tidak mengerti mengapa peter memberikan kode yang begitu besar untuk hal sederhana ini atau dia telah memberikan jawabannya dalam versi lama.

San
sumber
2

Juga dapat didefinisikan dalam xml tanpa membuat kelas khusus

style.xml

<style name="ionicons" parent="android:TextAppearance">
    <!-- Custom Attr-->
    <item name="fontPath">fonts/ionicons.ttf</item>
</style>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="@style/ionicons"
        android:text=""/>
</LinearLayout>

Catatan singkat, karena saya selalu lupa di mana harus meletakkan font, itu font yang harus di dalam assetsdan folder ini berada di tingkat yang sama itu resdan src, dalam kasus saya iniassets/fonts/ionicons.ttf

Diperbarui Menambahkan tata letak root karena metode ini perlu xmlns:app="http://schemas.android.com/apk/res-auto"bekerja

Perbarui 2 Lupa tentang perpustakaan yang telah saya instal sebelumnya bernama Kaligrafi

norman784
sumber
Ini tidak bekerja untuk saya. Ketika saya mencoba untuk membangun ini saya mendapatkan pesan kesalahan: Kesalahan: (49, 5) Tidak ada sumber daya yang cocok dengan nama yang diberikan: attr 'fontPath'.
Stef
Coba tambahkan xmlns:app="http://schemas.android.com/apk/res-auto"ke tata letak root Anda, periksa juga jawaban yang diperbarui
norman784
Kesalahan tidak berasal dari file tata letak XML tetapi dari file gaya XML. Tampaknya itu tidak 'tahu' apa fontPath itu.
Stef
Hak Anda, lupa bahwa saya memiliki perpustakaan bernama Calligrapy
norman784
1

Jawaban Peter adalah yang terbaik, tetapi dapat ditingkatkan dengan menggunakan styles.xml dari Android untuk menyesuaikan font Anda untuk semua tampilan teks di aplikasi Anda.

Kode saya ada di sini

Jelle
sumber
1

Ada dua cara untuk menyesuaikan font:

!!! font khusus saya di aset / fonts / iran_sans.ttf

Cara 1: Refreksi Typeface.class ||| Cara terbaik

panggil FontsOverride.setDefaultFont () di kelas memperluas Aplikasi, Kode ini akan menyebabkan semua font perangkat lunak diubah, bahkan font Toasts

AppController.java

public class AppController extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        //Initial Font
        FontsOverride.setDefaultFont(getApplicationContext(), "MONOSPACE", "fonts/iran_sans.ttf");

    }
}

FontsOverride.java

public class FontsOverride {

    public static void setDefaultFont(Context context, String staticTypefaceFieldName, String fontAssetName) {
        final Typeface regular = Typeface.createFromAsset(context.getAssets(), fontAssetName);
        replaceFont(staticTypefaceFieldName, regular);
    }

    private static void replaceFont(String staticTypefaceFieldName, final Typeface newTypeface) {
        try {
            final Field staticField = Typeface.class.getDeclaredField(staticTypefaceFieldName);
            staticField.setAccessible(true);
            staticField.set(null, newTypeface);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

Cara 2: gunakan setTypeface

untuk tampilan khusus panggil saja setTypeface () untuk mengubah font.

CTextView.java

public class CTextView extends TextView {

    public CTextView(Context context) {
        super(context);
        init(context,null);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context,attrs);
    }

    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context,attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    public CTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context,attrs);
    }

    public void init(Context context, @Nullable AttributeSet attrs) {

        if (isInEditMode())
            return;

        // use setTypeface for change font this view
        setTypeface(FontUtils.getTypeface("fonts/iran_sans.ttf"));

    }
}

FontUtils.java

public class FontUtils {

    private static Hashtable<String, Typeface> fontCache = new Hashtable<>();

    public static Typeface getTypeface(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if (tf == null) {
            try {
                tf = Typeface.createFromAsset(AppController.getInstance().getApplicationContext().getAssets(), fontName);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

}
Rasoul Miri
sumber
0

Anda dapat membuat kelas tampilan teks dengan mudah: -

Jadi apa yang perlu Anda lakukan pertama, buat Custom textviewkelas yang diperluas AppCompatTextView.

public class CustomTextView extends AppCompatTextView {
    private int mFont = FontUtils.FONTS_NORMAL;
    boolean fontApplied;

    public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(attrs, context);
    }

    public CustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, context);
    }

    public CustomTextView(Context context) {
        super(context);
        init(null, context);
    }

    protected void init(AttributeSet attrs, Context cxt) {
        if (!fontApplied) {
            if (attrs != null) {
                mFont = attrs.getAttributeIntValue(
                        "http://schemas.android.com/apk/res-auto", "Lato-Regular.ttf",
                        -1);
            }
            Typeface typeface = getTypeface();
            int typefaceStyle = Typeface.NORMAL;
            if (typeface != null) {
                typefaceStyle = typeface.getStyle();
            }
            if (mFont > FontUtils.FONTS) {
                typefaceStyle = mFont;
            }
            FontUtils.applyFont(this, typefaceStyle);
            fontApplied = true;
        }
    }
}

Sekarang, setiap kali panggilan tampilan teks khusus dan kami akan mendapatkan nilai int dari atribut int fontValue = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto","Lato-Regular.ttf",-1).

Atau

Kita juga bisa mendapatkan getTypeface () dari tampilan yang kita atur di xml ( android:textStyle="bold|normal|italic"). Jadi, lakukan apa yang ingin Anda lakukan.

Sekarang, kita buat FontUtilsuntuk mengatur semua font .ttf ke tampilan kita.

public class FontUtils {

    public static final int FONTS = 1;
    public static final int FONTS_NORMAL = 2;
    public static final int FONTS_BOLD = 3;
    public static final int FONTS_BOLD1 = 4;

    private static Map<String, Typeface> TYPEFACE = new HashMap<String, Typeface>();

    static Typeface getFonts(Context context, String name) {
        Typeface typeface = TYPEFACE.get(name);
        if (typeface == null) {
            typeface = Typeface.createFromAsset(context.getAssets(), name);
            TYPEFACE.put(name, typeface);
        }
        return typeface;
    }

    public static void applyFont(TextView tv, int typefaceStyle) {

        Context cxt = tv.getContext();
        Typeface typeface;

        if(typefaceStyle == Typeface.BOLD_ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }else if (typefaceStyle == Typeface.BOLD || typefaceStyle == SD_FONTS_BOLD|| typefaceStyle == FONTS_BOLD1) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-SemiBold.ttf");
        } else if (typefaceStyle == Typeface.ITALIC) {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Thin.ttf");
        } else {
            typeface = FontUtils.getFonts(cxt, "FaktPro-Normal.ttf");
        }
        if (typeface != null) {
            tv.setTypeface(typeface);
        }
    }
}
Duggu
sumber
0

Mungkin berguna untuk mengetahui bahwa mulai dari Android 8.0 (API level 26) Anda dapat menggunakan font khusus dalam XML .

Anda dapat menerapkan font khusus ke seluruh aplikasi dengan cara berikut.

  1. Letakkan font di folder res/font.

  2. Dalam res/values/styles.xmlmenggunakannya dalam tema aplikasi. <style name="AppTheme" parent="{whatever you like}"> <item name="android:fontFamily">@font/myfont</item> </style>

Vic
sumber