25

可能重复:
是否可以为整个应用程序设置字体?

我需要为整个应用程序设置自定义字体(.ttf 格式),我该怎么做?如果可能,来自 Manifest 或 XML 将是最佳选择

4

5 回答 5

22

编辑 2014 年 9 月:

对于仍然看到这个旧的可怕答案的人来说,真正的好答案就在这里:

https://stackoverflow.com/a/16883281/1154026


老的:

你最好的选择是:

自定义 Android 字体

所以

    TextView text = (TextView) findViewById(R.id.custom_font);
    Typeface font = Typeface.createFromAsset(getAssets(), "yourfont.ttf");
    text.setTypeface(font);

将您的 .ttf 放在“assets”文件夹的根目录中。

于 2012-09-05T12:53:52.417 回答
11

你可以这样做。创建一个自定义文本视图并在任何地方使用它

public class MyTextView extends android.widget.TextView
{

    public MyTextView(Context context)
    {
        this(context, null);
    }

    public MyTextView(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs);
        if (this.isInEditMode()) return ;

        final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SomeStyle);
        final String customFont = a.getString(R.styleable.SomeStyle_font);

        //Build a custom typeface-cache here!
        this.setTypeface(
            Typeface.createFromAsset(context.getAssets(), customFont)
        );  
    }
}

将此添加到 attrs.xml

<declare-styleable name="SomeStyle">
    <attr name="font" format="string" />
</declare-styleable>

然后在您的主题中,执行以下操作:这将确保所有文本视图都将使用样式 MyTextView

<item name="android:textViewStyle">@style/MyTextView</item>

现在我们可以使用这种样式中的自定义属性来定义您的自定义字体。

<style name="MyTextView" parent="@android:style/Widget.TextView">
    <item name="font">MyPathToFontInAssets.ttf</item>
</style>

所以每当你在项目中使用 MyTextView 时,它都会有你的自定义字体。

重要提示:字体不会被缓存,因此如果您打算使用此代码,您还应该构建一个自定义字体缓存,以便您可以为所有文本视图重新使用自定义字体。这将显着加快应用程序!

更新:正如 Amir 所说,这与自定义字体和 XML 布局 (Android)几乎相同,但我也使用 android 样式自动在应用程序中的所有文本视图上使用它。

于 2012-09-05T13:16:00.860 回答
10

创建一个 TextView 子类并在任何地方使用它

    public class RobotoTextView extends TextView {

    public RobotoTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public RobotoTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RobotoTextView(Context context) {
        super(context);
        init();
    }

    private void init() {
        if (!isInEditMode()) {
            Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/Roboto-Light.ttf");
            setTypeface(tf);
        }
    }

}

用法

<com.test.RobotoTextView
        android:id="@+id/name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />

在java代码中,您可以将其转换为 TextView

于 2012-09-05T12:58:47.333 回答
7
TextView tv=(TextView)findViewById(R.id.custom);
    Typeface face=Typeface.createFromAsset(getAssets(),
                                          "fonts/Verdana.ttf");

    tv.setTypeface(face);

将字体文件放在 /res/ 的字体文件夹中

喜欢我的回答,如果有帮助...

于 2012-09-05T12:53:27.603 回答
0

您可以按照此处的建议扩展 TextView并在其上设置您的字体,然后在整个应用程序中使用它。

于 2012-09-05T13:04:25.533 回答