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
You can only use custom fonts via Java code, not through layout XML or styles/themes -- sorry!

- 986,068
- 189
- 2,389
- 2,491
-
@SergiCastellsaguéMillán: This question was for using TTF fonts. The answer you linked to is for anything **but** TTF fonts. – CommonsWare Jan 05 '14 at 22:26
-
2Since 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 '
' document. – Einar Sundgren Aug 25 '15 at 18:32 -
1@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 Aug 25 '15 at 18:35
-
1@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." https://developer.android.com/preview/features/working-with-fonts.html – kartiraman Mar 22 '17 at 05:40
-
6It is now possible with support library, check this https://developer.android.com/preview/features/fonts-in-xml.html – Ahmad Dehnavi Aug 04 '17 at 14:49
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.

- 1,443
- 16
- 22
Yes, you can :)
step 1: Create a folder and name it 'font' and put your .ttf inside it.
step 2: Go to style.xml and do the following : -
step 3: Use the style tag anywhere in views(TextView, TabLayout,..etc.):-

- 960
- 11
- 13
-
1Before all this, first, you need to update to update to support library 26 here is a link https://segunfamisa.com/posts/custom-fonts-with-android-support-library – Mr.Q Jan 12 '18 at 18:19
-
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. – User Apr 17 '18 at 11:32
<?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>

- 937
- 10
- 11
-
1
-
1OP 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. – Michael Peterson Aug 18 '17 at 11:32
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);

- 2,690
- 5
- 26
- 39
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

- 2,167
- 5
- 19
- 33