Majid
Majid

Reputation: 517

Set font face in android

I want to change some textview font-face to external font and i do something like this :

typeFace = Typeface.createFromAsset(getAssets(),"fonts/bkoodak.ttf");
tv1.setTypeface(typeFace);
tv2.setTypeface(typeFace);
tv3.setTypeface(typeFace);
...

But this form is't nice to me. Is there some way to do this better?

Upvotes: 0

Views: 664

Answers (3)

tahhan
tahhan

Reputation: 81

Yes there is a better way.

But you have to create your own derived TextView that apply the TypeFace. And use it in your XML Layout.

Refer to this question for more details: How to make a custom TextView?

Upvotes: 1

m3esma
m3esma

Reputation: 277

You can use create a class and use it everywhere.

For example:

FontChanger Class:

public class FontChanger
{
    private Typeface typeface;

    public FontChanger(Typeface typeface)
    {
        this.typeface = typeface;
    }

    public FontChanger(AssetManager assets, String assetsFontFileName)
    {
        typeface = Typeface.createFromAsset(assets, assetsFontFileName);
    }

    public void replaceFonts(ViewGroup viewTree)
    {
        View child;
        for(int i = 0; i < viewTree.getChildCount(); ++i)
        {
            child = viewTree.getChildAt(i);
            if(child instanceof ViewGroup)
            {
                // recursive call
                replaceFonts((ViewGroup)child);
            }
            else if(child instanceof TextView)
            {
                // base case
                ((TextView) child).setTypeface(typeface);
            }
        }
    }
}

onCreate of your activity :

FontChanger fontChanger = new FontChanger(getAssets(), "font.otf");
fontChanger.replaceFonts((ViewGroup)this.findViewById(android.R.id.content));

Upvotes: 1

Piotr Golinski
Piotr Golinski

Reputation: 1000

You can create own TextView class:

public class MyTextView extends TextView {

        public MyTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init(attrs);
        }

        public MyTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(attrs);

        }

        public MyTextView(Context context) {
            super(context);
            init(null);
        }

        private void init(AttributeSet attrs) {
            if (attrs != null) {
                TypedArray a = getContext().obtainStyledAttributes(attrs,
                        R.styleable.MyTextView);

                Typeface myTypeface = Typeface.createFromAsset(getContext()
                        .getAssets(), "fonts/bkoodak.ttf");
                setTypeface(myTypeface);

                a.recycle();
            }
        }

    }

and use it in you layout:

 <yourpackage.MyTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

Upvotes: 1

Related Questions