编辑:所以已经有一段时间了,我想补充一下我认为是做到这一点的最佳方法,并且通过XML也是如此!
因此,首先,您将要创建一个新类,该类将覆盖您要自定义的任何View。(例如,想要一个带有自定义字体的Button吗?Extend Button
)。让我们举个例子:
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);
}
}
现在,如果您没有,请在下方添加一个XML文档res/values/attrs.xml
,然后添加:
<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>
好的,在此之前,让我们回到parseAttributes()
前面的方法:
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();
}
现在您已经准备就绪。您可以为任何东西添加更多属性(可以为typefaceStyle添加另一个属性-粗体,斜体等),现在让我们看看如何使用它:
<?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
行实际上可以是任何东西,但是约定如上所示。重要的是它是唯一的,这就是使用软件包名称的原因。现在,您只需将custom:
前缀用于属性,并将android:
前缀用于android属性。
最后一两件事:如果你想在风格(使用这个res/values/styles.xml
),你应该不加xmlns:custom
行。只需引用没有前缀的属性名称即可:
<style name="MyStyle>
<item name="typeface">roboto</item>
</style>
(PREVIOUS ANSWER)
在Android中使用自定义字体
这应该有所帮助。基本上,没有办法用XML做到这一点,据我所知,没有比这更简单的方法了。您始终可以有一个setLayoutFont()方法,该方法创建一次字体,然后为每个字体运行setTypeface()。每次向布局中添加新项目时,只需更新它即可。如下所示:
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);
}
编辑:所以我只是自己实现类似的东西,而最终我做的是制作这样的函数:
public static void setLayoutFont(Typeface tf, TextView...params) {
for (TextView tv : params) {
tv.setTypeface(tf);
}
}
然后,只需使用onCreate()中的此方法,并传递所有要更新的TextView:
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/BPreplay.otf");
//find views by id...
setLayoutFont(tf, tv1, tv2, tv3, tv4, tv5);
编辑9/5/12:
因此,由于这仍在获得意见和投票,因此我想添加一个更好,更完整的方法:
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);
}
}
如果将其作为布局的根传递,它将在该布局中递归检查TextView
或Button
视图(或添加到该if语句的其他任何视图),并设置字体,而不必通过ID指定它们。当然,这是假设您要为每个视图设置字体。