Custom fonts and XML layouts?

I’m trying to define a GUI layout using XML files in Android. As far as I can find out, there is no way to specify that your widgets should use a custom font (e.g. one you’ve placed in assets/font/) in XML files and you can only use the system installed fonts.

I know that, in the Java code, I could change the font of each widget manually using unique IDs. Alternatively, I could iterate over all the widgets in Java to make this change, but this would probably be very slow.

What other options do I have? Is there any better ways to making widgets that have a custom look? I don’t particularly want to have to manually change the font for every new widget I add.

extViewPlus.java:

 

package com.example;

 

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Typeface;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.TextView;

 

public class TextViewPlus extends TextView {

    private static final String TAG = "TextView";

 

    public TextViewPlus(Context context) {

        super(context);

    }

 

    public TextViewPlus(Context context, AttributeSet attrs) {

        super(context, attrs);

        setCustomFont(context, attrs);

    }

 

    public TextViewPlus(Context context, AttributeSet attrs, int defStyle) {

        super(context, attrs, defStyle);

        setCustomFont(context, attrs);

    }

 

    private void setCustomFont(Context ctx, AttributeSet attrs) {

        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.TextViewPlus);

        String customFont = a.getString(R.styleable.TextViewPlus_customFont);

        setCustomFont(ctx, customFont);

        a.recycle();

    }

 

    public boolean setCustomFont(Context ctx, String asset) {

        Typeface tf = null;

        try {

        tf = Typeface.createFromAsset(ctx.getAssets(), asset);  

        } catch (Exception e) {

            Log.e(TAG, "Could not get typeface: "+e.getMessage());

            return false;

        }

 

        setTypeface(tf);  

        return true;

    }

 

}

attrs.xml: (in res/values)

 





    

        

    



main.xml:

 





    xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:foo="http://schemas.android.com/apk/res/com.example"

    android:orientation="vertical" android:layout_width="fill_parent"

    android:layout_height="fill_parent">

 

    

        android:id="@+id/textViewPlus1"

        android:layout_height="match_parent"

        android:layout_width="match_parent"

        android:text="@string/showingOffTheNewTypeface"

        foo:customFont="saxmono.ttf">