Jawaban singkat: Tidak. Android tidak memiliki dukungan bawaan untuk menerapkan font khusus ke widget teks melalui XML.
Namun, ada solusi yang tidak terlalu sulit untuk diterapkan.
Pertama
Anda harus menentukan gaya Anda sendiri. Di folder / res / values Anda, buka / buat file attrs.xml dan tambahkan objek yang dapat dideklarasikan bergaya seperti ini:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FontText">
<attr name="typefaceAsset" format="string"/>
</declare-styleable>
</resources>
Kedua
Dengan asumsi Anda ingin sering menggunakan widget ini, Anda harus menyiapkan cache sederhana untuk Typeface
objek yang dimuat , karena memuatnya dari memori dengan cepat dapat memakan waktu. Sesuatu seperti:
public class FontManager {
private static FontManager instance;
private AssetManager mgr;
private Map<String, Typeface> fonts;
private FontManager(AssetManager _mgr) {
mgr = _mgr;
fonts = new HashMap<String, Typeface>();
}
public static void init(AssetManager mgr) {
instance = new FontManager(mgr);
}
public static FontManager getInstance() {
if (instance == null) {
AssetManager assetManager = App.getContext().getAssets();
init(assetManager);
}
return instance;
}
public Typeface getFont(String asset) {
if (fonts.containsKey(asset))
return fonts.get(asset);
Typeface font = null;
try {
font = Typeface.createFromAsset(mgr, asset);
fonts.put(asset, font);
} catch (Exception e) {
}
if (font == null) {
try {
String fixedAsset = fixAssetFilename(asset);
font = Typeface.createFromAsset(mgr, fixedAsset);
fonts.put(asset, font);
fonts.put(fixedAsset, font);
} catch (Exception e) {
}
}
return font;
}
private String fixAssetFilename(String asset) {
if (TextUtils.isEmpty(asset))
return asset;
if ((!asset.endsWith(".ttf")) && (!asset.endsWith(".ttc")))
asset = String.format("%s.ttf", asset);
return asset;
}
}
Yang ini akan memungkinkan Anda untuk menggunakan ekstensi file .ttc, tetapi belum teruji.
Ketiga
Buat kelas baru yang merupakan subkelas TextView
. Contoh khusus ini memperhitungkan jenis huruf XML yang ditentukan ( bold
,, italic
dll.) Dan menerapkannya ke font (dengan asumsi Anda menggunakan file .ttc).
public class FontText extends TextView {
public FontText(Context context) {
this(context, null);
}
public FontText(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FontText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (isInEditMode())
return;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.FontText);
if (ta != null) {
String fontAsset = ta.getString(R.styleable.FontText_typefaceAsset);
if (!TextUtils.isEmpty(fontAsset)) {
Typeface tf = FontManager.getInstance().getFont(fontAsset);
int style = Typeface.NORMAL;
float size = getTextSize();
if (getTypeface() != null)
style = getTypeface().getStyle();
if (tf != null)
setTypeface(tf, style);
else
Log.d("FontText", String.format("Could not create a font from asset: %s", fontAsset));
}
}
}
}
Akhirnya
Ganti contoh TextView
dalam XML Anda dengan nama kelas yang memenuhi syarat. Deklarasikan namespace kustom Anda seperti yang Anda lakukan pada namespace Android. Perhatikan bahwa "typefaceAsset" harus mengarah ke file .ttf atau .ttc yang ada di direktori / assets Anda.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.example.FontText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is a custom font text"
custom:typefaceAsset="fonts/AvenirNext-Regular.ttf"/>
</RelativeLayout>