EDIT : Jadi sudah lama, dan saya ingin menambahkan apa yang menurut saya adalah cara terbaik untuk melakukan ini, dan melalui XML tidak kurang!
Jadi pertama-tama, Anda ingin membuat kelas baru yang menimpa Tampilan apa pun yang ingin Anda sesuaikan. (mis. ingin Tombol dengan jenis huruf kustom? Perluas Button
). Mari kita buat contoh:
public class CustomButton extends Button {
private final static int ROBOTO = 0;
private final static int ROBOTO_CONDENSED = 1;
public CustomButton(Context context) {
super(context);
}
public CustomButton(Context context, AttributeSet attrs) {
super(context, attrs);
parseAttributes(context, attrs); //I'll explain this method later
}
public CustomButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
parseAttributes(context, attrs);
}
}
Sekarang, jika Anda tidak memilikinya, tambahkan dokumen XML di bawah res/values/attrs.xml
, dan tambahkan:
<resources>
<!-- Define the values for the attribute -->
<attr name="typeface" format="enum">
<enum name="roboto" value="0"/>
<enum name="robotoCondensed" value="1"/>
</attr>
<!-- Tell Android that the class "CustomButton" can be styled,
and which attributes it supports -->
<declare-styleable name="CustomButton">
<attr name="typeface"/>
</declare-styleable>
</resources>
Oke, jadi setelah itu, mari kita kembali ke parseAttributes()
metode dari sebelumnya:
private void parseAttributes(Context context, AttributeSet attrs) {
TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.CustomButton);
//The value 0 is a default, but shouldn't ever be used since the attr is an enum
int typeface = values.getInt(R.styleable.CustomButton_typeface, 0);
switch(typeface) {
case ROBOTO: default:
//You can instantiate your typeface anywhere, I would suggest as a
//singleton somewhere to avoid unnecessary copies
setTypeface(roboto);
break;
case ROBOTO_CONDENSED:
setTypeface(robotoCondensed);
break;
}
values.recycle();
}
Sekarang Anda sudah siap. Anda dapat menambahkan lebih banyak atribut untuk tentang apa saja (Anda dapat menambahkan atribut lain untuk typefaceStyle - tebal, miring, dll.) Tetapi sekarang mari kita lihat cara menggunakannya:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/com.yourpackage.name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.yourpackage.name.CustomButton
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me!"
custom:typeface="roboto" />
</LinearLayout>
Itu xmlns:custom
garis benar-benar dapat apa-apa, tapi konvensi adalah apa yang ditunjukkan di atas. Yang penting itu unik, dan itulah mengapa nama paket digunakan. Sekarang Anda cukup menggunakan custom:
awalan untuk atribut Anda, dan android:
awalan untuk atribut android.
Satu hal terakhir: jika Anda ingin menggunakan ini dalam gaya ( res/values/styles.xml
), Anda tidak boleh menambahkan xmlns:custom
baris. Cukup rujuk nama atribut tanpa awalan:
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
Menggunakan jenis huruf khusus di Android
Ini akan membantu. Pada dasarnya, tidak ada cara untuk melakukan ini dalam XML, dan sejauh yang saya tahu, tidak ada cara yang lebih mudah untuk melakukannya dalam kode. Anda selalu bisa memiliki metode setLayoutFont () yang membuat jenis huruf satu kali, lalu menjalankan setTypeface () untuk masing-masing. Anda hanya perlu memperbaruinya setiap kali Anda menambahkan item baru ke tata letak. Sesuatu seperti di bawah ini:
public void setLayoutFont() {
Typeface tf = Typeface.createFromAsset(
getBaseContext().getAssets(), "fonts/BPreplay.otf");
TextView tv1 = (TextView)findViewById(R.id.tv1);
tv1.setTypeface(tf);
TextView tv2 = (TextView)findViewById(R.id.tv2);
tv2.setTypeface(tf);
TextView tv3 = (TextView)findViewById(R.id.tv3);
tv3.setTypeface(tf);
}
EDIT : Jadi saya baru saja menerapkan sesuatu seperti ini sendiri, dan bagaimana saya akhirnya melakukannya adalah membuat fungsi seperti ini:
public static void setLayoutFont(Typeface tf, TextView...params) {
for (TextView tv : params) {
tv.setTypeface(tf);
}
}
Kemudian, cukup gunakan metode ini dari onCreate (), dan teruskan semua TextView yang ingin Anda perbarui:
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
EDIT 9/5/12:
Jadi karena ini masih mendapatkan tampilan dan suara, saya ingin menambahkan metode yang jauh lebih baik dan lebih lengkap:
Typeface mFont = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
ViewGroup root = (ViewGroup)findViewById(R.id.myrootlayout);
setFont(root, mFont);
/*
* Sets the font on all TextViews in the ViewGroup. Searches
* recursively for all inner ViewGroups as well. Just add a
* check for any other views you want to set as well (EditText,
* etc.)
*/
public void setFont(ViewGroup group, Typeface font) {
int count = group.getChildCount();
View v;
for(int i = 0; i < count; i++) {
v = group.getChildAt(i);
if(v instanceof TextView || v instanceof Button /*etc.*/)
((TextView)v).setTypeface(font);
else if(v instanceof ViewGroup)
setFont((ViewGroup)v, font);
}
}
Jika Anda meneruskannya ke root layout Anda, itu akan secara rekursif memeriksa TextView
atau Button
melihat (atau orang lain yang Anda tambahkan ke pernyataan if) di dalam tata letak itu, dan menyetel font tanpa Anda harus menentukannya dengan ID. Ini tentu saja dengan asumsi Anda ingin mengatur font ke setiap tampilan.