29

I'm defining a style XML for my android app. I have some TTF files I want to use, how can I set the typeface to use those files as the font as opposed to the generic "sans", "serif" & "monospace". Thanks

6 Answers 6

47

You can only use custom fonts via Java code, not through layout XML or styles/themes -- sorry!

Sign up to request clarification or add additional context in comments.

5 Comments

@SergiCastellsaguéMillán: This question was for using TTF fonts. The answer you linked to is for anything but TTF fonts.
Since this is an old answer; are you aware if this has anything changed in later versions, @CommonsWare ? I too would love to be able to change fonts by defining it in a '<styles>' document.
@EinarSundgren: It definitely has not been changed in later versions, in stock Android. There are various libraries that try to simplify font usage (e.g., Calligraphy).
@CommonsWare "Android O introduces a new feature, Fonts in XML, which lets you use fonts as resources. Android O also provides a mechanism to retrieve information related to system fonts and provide file descriptors." developer.android.com/preview/features/working-with-fonts.html
It is now possible with support library, check this developer.android.com/preview/features/fonts-in-xml.html
16

TextViewPlus.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)

<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TextViewPlus"> <attr name="customFont" format="string"/> </declare-styleable> </resources> 

main.xml:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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"> <com.example.TextViewPlus android:id="@+id/textViewPlus1" android:layout_height="match_parent" android:layout_width="match_parent" android:text="@string/showingOffTheNewTypeface" foo:customFont="saxmono.ttf"> </com.example.TextViewPlus> </LinearLayout> 

You would put "saxmono.ttf" in the assets folder.

Comments

12

Yes, you can :)

step 1: Create a folder and name it 'font' and put your .ttf inside it. Step one

step 2: Go to style.xml and do the following : - step two

step 3: Use the style tag anywhere in views(TextView, TabLayout,..etc.):-

Step three

2 Comments

Before all this, first, you need to update to update to support library 26 here is a link segunfamisa.com/posts/custom-fonts-with-android-support-library
Unfortunately it's not that simple, some elements (like the titles of alert dialogs) apparently still need for it to be set programmatically. But in general this is the up to date way to do it, yes. Just needs more work.
8
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources> 

2 Comments

what if I want to use sans-serif?
OP asked "I have some TTF files I want to use". monospace may technically be a font, but it isn't a helpful answer to this question. monospace is special built in Typeface, it doesn't help you achieve the goal of using any TTF file of your choosing.
1

enter image description here

Create a font dir on resource folder and paste your ttf font file. Then create a font resource XML and paste following lines.

 <?xml version="1.0" encoding="utf-8"?> <font-family xmlns:android="http://schemas.android.com/apk/res/android"> <font android:fontStyle="normal" android:fontWeight="400" android:font="@font/roboto_light" /> <font android:fontStyle="italic" android:fontWeight="400" android:font="@font/roboto_light_italic" /> </font-family> 

Now you can apply font as below. Also note attribute 'textStyle'

 <TextView android:textStyle="italic" android:fontFamily="@font/family_roboto_light" android:textColor="@color/primaryTextColor" android:textSize="20sp" android:gravity="center" android:id="@+id/textView36" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="No Internet connection" /> <TextView android:fontFamily="@font/family_roboto_light" android:textStyle="normal" android:textSize="20sp" android:gravity="center" android:id="@+id/textView37" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="No Internet connection" /> 

If you want done from code use following, but minimum API level 26

Typeface typeface = getResources().getFont(R.font. roboto_light_italic); textView.setTypeface(typeface); 

The Support Library 26.0 provides support to the Fonts in XML feature on devices running Android 4.1 (API level 16) and higher.

Typeface typeface = ResourcesCompat.getFont(context, R.font. roboto_light_italic); 

Comments

0

This works for me

<?xml version="1.0" encoding="utf-8"?> <resources> <style name="raffle_view_toolbar_style"> <item name="android:fontFamily">@font/press_start_2p</item> </style> </resources> 

Using Google Font

<?xml version="1.0" encoding="utf-8"?> <font-family xmlns:app="http://schemas.android.com/apk/res-auto" app:fontProviderAuthority="com.google.android.gms.fonts" app:fontProviderPackage="com.google.android.gms" app:fontProviderQuery="Press Start 2P" app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"> </font-family> 

Downloaded in Android Studio

Comments