Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting custom font to all TextViews

Tags:

android

fonts

Is there an easy way to make all textviews (and any other text elements in my app) to use a custom font of my own (and not the built-in choices), without having to manually set them via textview.setTypeface()?

I guess extending Textview would do the trick but then building interfaces with the visual editor is kind of a pain. I was thinking of something like styling but can't find how to set a custom font there.

like image 242
MichelReap Avatar asked Aug 21 '13 11:08

MichelReap


People also ask

How do I change my text Font on Android?

On your device, open the Settings app. Search and select Font size. To change your preferred font size, move the slider left or right.


2 Answers

You can create a method to set typeface for a textview in a common class and you can set the call that method and send the textview as its attribute.

like image 23
Hariharan Avatar answered Nov 11 '22 04:11

Hariharan


If you need to set one font for all TextViews in android application you can use this solution. It will override ALL TextView's typefaces, includes action bar and other standard components, but EditText's password font won't be overriden.

MyApp.java

    public class MyApp extends Application {

    @Override
    public void onCreate()
    {
                TypefaceUtil.overrideFont(getApplicationContext(), "SERIF", "fonts/Roboto-Regular.ttf"); 
     }
    }

TypefaceUtil.java

public class TypefaceUtil {

    /**
     * Using reflection to override default typeface
     * NOTICE: DO NOT FORGET TO SET TYPEFACE FOR APP THEME AS DEFAULT TYPEFACE WHICH WILL BE OVERRIDDEN
     * @param context to work with assets
     * @param defaultFontNameToOverride for example "monospace"
     * @param customFontFileNameInAssets file name of the font from assets
     */
    public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
        try {
            final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);

            final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToOverride);
            defaultFontTypefaceField.setAccessible(true);
            defaultFontTypefaceField.set(null, customFontTypeface);
        } catch (Exception e) {
            Log.e("TypefaceUtil","Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
        }
    }
}

themes.xml

     <?xml version="1.0" encoding="utf-8"?>
   <resources>
     <style name="MyAppTheme" parent="@android:style/Theme.Holo.Light">
    <!-- you should set typeface which you want to override with TypefaceUtil -->
    <item name="android:typeface">serif</item>
   </style>
   </resources>

Update for Android 5.0 or greater

As i have investigated and tested on device running api 5.0 or greater this solution is working fine because i am using the single style.xml file and not making other style.xml in values-21 folder

Although Some users asking me that this solution not working with android 5.0 device (they may be using values-21 style.xml i guess)

So that is because Under API 21, most of the text styles include fontFamily setting, like

<item name="fontFamily">@string/font_family_body_1_material</item>

Which applys the default Roboto Regular font:

<string name="font_family_body_1_material">sans-serif</string>

So the best solution is

If Any one having problem not working for 5.0+. Don't override typeface in your values-v21 styles.

Just override font in values/style.xml and you will good to go :)

like image 140
Paras Valera Avatar answered Nov 11 '22 03:11

Paras Valera