设置android自定义字体的最佳做法是什么?

时间:2017-08-06 12:46:01

标签: android fonts custom-font

我是android的初学者,我想改变一些控制字体。

第一种方式:

   TextView tx = (TextView)findViewById(R.id.textview1);

   Typeface custom_font = Typeface.createFromAsset(getAssets(),  "fonts/abc.ttf");

   tx.setTypeface(custom_font)

这种方式并不好,因为你必须找到所有控件来设置字体

第二种方式:  创建从目标控件

扩展的自定义控件
public class TextViewWithFont extends TextView {

        public TextViewWithFont(Context context, AttributeSet attrs) {
            super(context, attrs);
            Typeface custom_font = Typeface.createFromAsset(getAssets(),  "fonts/abc.ttf")
            this.setTypeface(custom_font);
        }

        public TextViewWithFont(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            Typeface custom_font = Typeface.createFromAsset(getAssets(),  "fonts/abc.ttf")
            this.setTypeface(custom_font);
        }

        public TextViewWithFont(Context context) {
            super(context);
            Typeface custom_font = Typeface.createFromAsset(getAssets(),  "fonts/abc.ttf")
            this.setTypeface(custom_font);
        }
第三种方式:使用书法图书馆

所以大家好吗?哪一个更好,你知道改变字体的其他方法吗?

2 个答案:

答案 0 :(得分:3)

这里我只是给出一些提示,如何在XML布局中使用自定义字体。

在本例中,我使用Roboto字体,您可以根据您的要求进行更改。

首先,在您的attr中创建自定义字体样式,

   <declare-styleable name="TCTextView">
        <attr name="fontType">
            <enum name="RobotoBold" value="0" />
            <enum name="RobotoBoldItalic" value="1" />
        </attr>
    </declare-styleable>

像这样创建自定义TextView,

public class MKTextView extends TextView {

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

        init(context, attrs);
    }

    public MKTextView(Context context) {
        super(context);
    }

    public MKTextView(Context context, AttributeSet attrs) {
        super(context, attrs, 0);

        init(context, attrs);
    }

    /**
     * To initialize the default value to the component.
     *
     * @param context
     * @param attrs
     */
    private void init(Context context, AttributeSet attrs) {
        Typeface typeface = FontUtil.getTCFont(context, attrs);

        if (typeface != null) {
            setTypeface(typeface);
        }

    }
}

使用此Helper Util类获取和设置自定义字体

public class FontUtil {

    /**
     * To set the custom font based on the attribute settings.
     *
     * @param ctx
     *         Context
     * @param attrs
     *         attribute setting for the components.
     *
     * @return {@link Typeface}
     */
    public static Typeface getTCFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.MKTextView);

        int value = a.getInt(R.styleable.MKTextView_fontType, 0);

        final String customFont = getFontName(value);

        a.recycle();

        return getTCFont(ctx, customFont);
    }

    /**
     * Get the Font name in assert folder based in {@link Fonts}
     *
     * @param fonts
     *         {@link Fonts}
     *
     * @return Font name in assert folder
     */
    private static String getFontName(int fonts) {
        final String customFont;
        switch (fonts) {
            case 0:
                customFont = "Roboto-Bold.ttf";
                break;
            case 1:
                customFont = "Roboto-BoldItalic.ttf";
                break;
            default:
                customFont = "Roboto-BoldItalic.ttf";
                break;
        }

        return customFont;
    }

    /**
     * To get the {@link Typeface} based on the font type(in asserts/fonts).
     *
     * @param ctx
     *         Context
     * @param asset
     *         font name in fonts folder
     *
     * @return {@link Typeface}
     */
    private static Typeface getTCFont(Context ctx, String asset) {
        Typeface tf = null;

        try {
            tf = Typeface.createFromAsset(ctx.getAssets(), "fonts/" + asset);
        } catch (Exception e) {
            return null;
        }

        return tf;
    }
}

您可以像这样使用XML布局,

<in.muthu.stackoverflow.font.MKTextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Text"
    app:fontType="RobotoBold"/>

答案 1 :(得分:2)

这是应用程序类

public class AppController extends Application {
    public static Typeface customTF;
    @Override
    public void onCreate() {
        super.onCreate();
        customTF = Typeface.createFromAsset(getAssets(), "fonts/custom_font.ttf");

    }

}

将类名添加到清单文件

中的应用程序标记
<application
        android:name=".AppController"
        ...
        ...
        >

使用字体

tvTitle.setTypeface(AppController.customTF);