gpt4 book ai didi

Android:想要为整个应用程序而不是运行时设置自定义字体

转载 作者:IT老高 更新时间:2023-10-28 13:05:13 24 4
gpt4 key购买 nike

是否可以在应用程序的每个控件中设置任何自定义字体?不一定是运行时? (即,如果可能,从 xml 或 JAVA 文件中的整个应用程序只使用一次)

我可以通过这段代码为一个控件设置字体。

public static void setFont(TextView textView) {
Typeface tf = Typeface.createFromAsset(textView.getContext()
.getAssets(), "fonts/BPreplay.otf");

textView.setTypeface(tf);

}

这段代码的问题是每个控件都应该调用它。我想调用这个或任何类似的方法一次,或者如果可能的话在 xml 中设置属性。有可能吗?

最佳答案

编辑:已经有一段时间了,我想添加我认为最好的方法来做到这一点,并且至少通过 XML!

首先,您需要创建一个新类来覆盖您想要自定义的任何 View 。 (例如,想要一个带有自定义字体的按钮?扩展 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);
}
}

现在,如果您没有,请在 res/values/attrs.xml 下添加一个 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();
}

现在一切就绪。您可以为任何东西添加更多属性(您可以为字体样式添加另一个属性——粗体、斜体等),但现在让我们看看如何使用它:

<?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:自定义行。只需引用不带前缀的属性名称:

<style name="MyStyle>
<item name="typeface">roboto</item>
</style>

                               (PREVIOUS ANSWER)

Using a custom typeface in 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);
}
}

如果您将布局的根传递给它,它将递归检查该布局中的 TextViewButton View (或您添加到该 if 语句的任何其他 View ) , 并设置字体,而无需通过 ID 指定它们。这当然是假设您要将字体设置为 every View 。

关于Android:想要为整个应用程序而不是运行时设置自定义字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4395309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com