Пользовательский шрифт TrueType только от xml

Есть ли способ передать пользовательский шрифт для TextView (или его подклассов), используя только xml без предоставления какого-либо java-кода, подобного этому

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/CustomFont.ttf");

Ответ 1

Это невозможно сделать исключительно из XML, но вы можете создать собственное представление и ссылку на него из XML. Таким образом вам нужно будет только один раз написать код, что позволит вам перерабатывать его в разных макетах.

Например, объявите класс FontTextView:

package com.example;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class FontTextView extends TextView {

    /** 
     *  Note that when generating the class from code, you will need
     *  to call setCustomFont() manually.
     */
    public FontTextView(Context context) {
        super(context);
    }

    public FontTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setCustomFont(this, attrs);
    }

    public FontTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setCustomFont(this, attrs);
    }

    private void setCustomFont(Context context, AttributeSet attrs) {
        if (isInEditMode()) {
            // Ignore if within Eclipse
            return;
        }
        String font = "myDefaultFont.ttf";
        if (attrs != null) {
            // Look up any layout-defined attributes
            TypedArray a = obtainStyledAttributes(attrs,
                    R.styleable.FontTextView);
            for (int i = 0; i < a.getIndexCount(); i++) {
                int attr = a.getIndex(i);
                switch (attr) {
                case R.styleable.FontTextView_customFont:
                    font = a.getString(attr, 0);
                    break;
                }
            }
            a.recycle();
        }
        Typeface tf = null;
        try {
            tf = Typeface.createFromAsset(getAssets(), font);
        } catch (Exception e) {
            Log.e("Could not get typeface: " + e.getMessage());
        }
        setTypeface(tf);
    }

}

Определите атрибут в res/values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="FontTextView">
        <attr name="customFont" format="string" />
    </declare-styleable>

</resources>

Используйте его в макете:

  • Объявить пространство имен:

    xmlns:custom="http://schemas.android.com/apk/res/com.example"
    
  • Используйте FontTextView:

    <com.example.FontTextView
        android:id="@+id/introduction"
        customFont="myCustomFont.ttf"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Hello world!" />