[Java] 在使用xml的android TextView中使用自定义字体


Answers

以下是执行此操作的示例代码。 我在静态最终变量中定义了字体,字体文件位于资产目录中。

public class TextViewWithFont extends TextView {

    public TextViewWithFont(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.setTypeface(MainActivity.typeface);
    }

    public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.setTypeface(MainActivity.typeface);
    }

    public TextViewWithFont(Context context) {
        super(context);
        this.setTypeface(MainActivity.typeface);
    }

}
Question

我已将自定义字体文件添加到我的assets / fonts文件夹。 我如何从我的XML中使用它?

我可以从代码中使用它,如下所示:

TextView text = (TextView) findViewById(R.id.textview03);
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/Molot.otf");
text.setTypeface(tf);

我不能使用android:typeface="/fonts/Molot.otf"属性从XML执行此操作吗?




而不是xmlns:custom =“schemas.android.com/tools”; 你应该使用:xmlns:custom =“schemas.android.com/apk/res-auto”; 以便使用可修改的属性。 我做了这个改变,现在正在工作。




更新: Calligraphy : Calligraphy似乎是一个优越的解决方案。

也许你可以在应用程序创建时使用反射来将字体插入到可用字体的静态列表中 ? 如果这真的是一个非常糟糕的主意,或者如果这是一个很好的解决方案 - 我认为它会成为这些极端之一......

我能够使用我自己的字体系列名称将自定义字体注入到系统字体列表中,然后在标准TextView上指定该自定义字体系列名称(“brush-script”)作为android:FontFamily的值运行Android 6.0的G4。

public class MyApplication extends android.app.Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();

        Typeface font = Typeface.createFromAsset(this.getResources().getAssets(),"fonts/brush-script.ttf");
        injectTypeface("brush-script", font);
    }

    private boolean injectTypeface(String fontFamily, Typeface typeface)
    {
        try
        {
            Field field = Typeface.class.getDeclaredField("sSystemFontMap");
            field.setAccessible(true);
            Object fieldValue = field.get(null);
            Map<String, Typeface> map = (Map<String, Typeface>) fieldValue;
            map.put(fontFamily, typeface);
            return true;
        }
        catch (Exception e)
        {
            Log.e("Font-Injection", "Failed to inject typeface.", e);
        }
        return false;
    }
}

在我的布局

<TextView
    android:id="@+id/name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Fancy Text"
    android:fontFamily="brush-script"/>



创建您自定义的TextView属于您要使用的字体。 在这个类中,我使用静态mTypeface字段来缓存字体(为了获得更好的性能)

public class HeliVnTextView extends TextView {

/*
 * Caches typefaces based on their file path and name, so that they don't have to be created every time when they are referenced.
 */
private static Typeface mTypeface;

public HeliVnTextView(final Context context) {
    this(context, null);
}

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

public HeliVnTextView(final Context context, final AttributeSet attrs, final int defStyle) {
    super(context, attrs, defStyle);

     if (mTypeface == null) {
         mTypeface = Typeface.createFromAsset(context.getAssets(), "HelveticaiDesignVnLt.ttf");
     }
     setTypeface(mTypeface);
}

}

在xml文件中:

<java.example.HeliVnTextView
        android:id="@+id/textView1"
        android:layout_width="0dp"
        ... />

在java类中:

HeliVnTextView title = new HeliVnTextView(getActivity());
title.setText(issue.getName());