DÜZENLEME : Uzun zaman oldu ve bunu yapmanın en iyi yolu olduğunu düşündüğüm şeyi eklemek istiyorum ve XML aracılığıyla daha az değil!
Öncelikle, özelleştirmek istediğiniz Görünümü geçersiz kılan yeni bir sınıf oluşturmak isteyeceksiniz. (ör Button
. özel yazı tipine sahip bir Düğme mi istiyorsunuz? Genişletin ). Bir örnek verelim:
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);
}
}
Şimdi, yoksa, altına bir XML belgesi res/values/attrs.xml
ekleyin ve şunu ekleyin:
<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>
Tamam, öyleyse bunun dışında, parseAttributes()
yönteme daha önce geri dönelim :
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();
}
Artık hazırsınız. Herhangi bir şey için daha fazla öznitelik ekleyebilirsiniz (typefaceStyle için başka bir tane ekleyebilirsiniz - kalın, italik, vb.) Ama şimdi nasıl kullanılacağını görelim:
<?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>
xmlns:custom
Satır gerçekten herhangi bir şey olabilir, ama kongre yukarıda gösterilen şeydir. Önemli olan benzersiz olmasıdır ve bu yüzden paket adı kullanılır. Artık custom:
özellikleriniz için android:
ön eki ve android özellikleri için ön eki kullanırsınız.
Son bir şey: Bir stil (bu kullanmak istiyorsanız res/values/styles.xml
), sen gerektiğini değil eklemek xmlns:custom
hattı. Önek olmadan özniteliğin adına referans verin:
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
Android'de özel bir yazı tipi kullanma
Bu yardımcı olmalı. Temel olarak, bunu XML'de yapmanın bir yolu yok ve anlayabildiğim kadarıyla bunu kodda yapmanın daha kolay bir yolu yok. Her zaman bir setLayoutFont () yöntemine sahip olabilirsiniz, bu yöntem bir kez yazı tipini oluşturur ve ardından her biri için setTypeface () öğesini çalıştırır. Bir düzene her yeni öğe eklediğinizde sadece güncellemeniz gerekir. Aşağıdaki gibi bir şey:
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);
}
DÜZENLEME : Ben de böyle bir şeyi kendim uygulamaya başladım ve bunu nasıl yaptığım şöyle bir işlev yapıyordu:
public static void setLayoutFont(Typeface tf, TextView...params) {
for (TextView tv : params) {
tv.setTypeface(tf);
}
}
Ardından, onCreate () 'deki bu yöntemi kullanın ve güncellemek istediğiniz tüm Metin Görünümlerini iletin:
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
9/5/12 DÜZENLE:
Bu hala görüş ve oy aldığından, çok daha iyi ve daha eksiksiz bir yöntem eklemek istiyorum:
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);
}
}
Bunu mizanpajınızın kök dizininden geçirirseniz, o mizanpaj içinde tekrar tekrar kontrol eder TextView
veya Button
görüntüler (veya bu if ifadesine eklediğiniz diğerlerini) ve kimlik ile belirtmenize gerek kalmadan yazı tipini ayarlar. Elbette bu, yazı tipini her görünüme ayarlamak istediğinizi varsayar .