Pregunta

¿Hay alguna forma de pasar la fuente personalizada para TextView (o subclases) utilizando solo XML sin proporcionar ningún código Java como este?

Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/CustomFont.ttf");
¿Fue útil?

Solución

No es posible hacerlo Puramente de XML, pero tu pueden Cree una vista y referencia personalizadas que desde XML. De esta manera, solo necesitará escribir el código una vez, lo que le permite reciclarlo en varios diseños.

Por ejemplo, declara la clase 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);
    }

}

Defina el atributo en res/values/attrs.xml:

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

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

</resources>

Úselo en un diseño:

  1. Declarar el espacio de nombres:

    xmlns:custom="http://schemas.android.com/apk/res/com.example"
    
  2. Utilizar el 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!" />
    
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top