Typography plays a crucial role in modern user interface design. Android supports using external fonts beyond the default system typefaces to deliver more expressive and branded text experiences. You can apply custom fonts to any text-based view, such as TextView, Button, or EditText.
This guide explains how to use external fonts in Android — whether bundled with your app or downloaded on demand — with best practices and clear examples.
What Are External Fonts in Android?
External fonts are any font files that are not part of the Android system defaults (e.g., sans-serif, serif, monospace). These include:
- Custom TTF/OTF files shipped with the app
- Downloadable fonts via Google Fonts or Fonts in XML
- Typeface collections referenced programmatically
Using external fonts enhances readability, branding, and design consistency across devices.
Supported Font File Types
Android supports the following font file formats:
| Format | Description |
|---|---|
| TTF | TrueType Font |
| OTF | OpenType Font |
| TTC | TrueType Collection |
For most cases, TTF and OTF files work seamlessly.
Method 1 – Using Fonts in XML (Resource Fonts)
Since Android Support Library 26 / AndroidX Core 1.0+, you can place font files in the font resource directory and reference them directly in XML.
Step 1 — Add Font Resources
- In Android Studio, right-click
res→ New → Android Resource Directory - Select font as Resource type
- Place your font files (
myfont.ttf,myfontbold.otf, etc.) intores/font/
Step 2 — Reference Font in XML
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Custom Font Text"
android:fontFamily="@font/myfont"/>
This applies the external font directly in the layout.
Method 2 – Using Fonts Programmatically
You can apply external fonts in Java/Kotlin code using ResourcesCompat:
TextView textView = findViewById(R.id.textView);
Typeface typeface = ResourcesCompat.getFont(this, R.font.myfont);
textView.setTypeface(typeface);
This method is useful when dynamic font assignment is needed.
Method 3 – Using Downloadable Fonts (Google Fonts)
Downloadable fonts allow apps to request fonts from a provider (e.g., Google Fonts) at runtime without bundling the font file.
Step 1 — Add Dependencies
Make sure your project uses AndroidX and includes:
implementation "androidx.core:core:1.7.0"
implementation "androidx.appcompat:appcompat:1.4.1"
Step 2 — Define a Font Family in XML
Create a font family XML under res/font/ (e.g., roboto.xml):
<font-family xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:fontProviderAuthority="com.google.android.gms.fonts"
app:fontProviderPackage="com.google.android.gms"
app:fontProviderQuery="Roboto:400,700"
app:fontProviderCerts="@array/com_google_android_gms_fonts_certs">
</font-family>
Step 3 — Use It in XML
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/roboto"
android:text="Downloadable Font Example"/>
Android will download the font at runtime and cache it.
Method 4 – Custom View With Typeface Attribute
For reusable components, you can create a custom view that supports font attributes.
Custom Attribute Definition (attrs.xml)
<declare-styleable name="CustomFontTextView">
<attr name="fontPath" format="string"/>
</declare-styleable>
Custom TextView Class
public class CustomFontTextView extends AppCompatTextView {
public CustomFontTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomFontTextView);
String fontPath = a.getString(R.styleable.CustomFontTextView_fontPath);
if (fontPath != null) {
Typeface tf = Typeface.createFromAsset(context.getAssets(), fontPath);
setTypeface(tf);
}
a.recycle();
}
}
Usage in Layout
<com.example.CustomFontTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:fontPath="fonts/myfont.ttf"
android:text="Custom Font via Asset"/>
This pattern lets designers specify font files in XML without repeated Java code.
Styling Fonts With Themes
You can define a text appearance style with a font family:
styles.xml
<style name="AppTextStyle">
<item name="android:fontFamily">@font/myfont</item>
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/primaryText</item>
</style>
Apply to View
<TextView
style="@style/AppTextStyle"
android:text="Styled External Font"/>
This centralizes typography rules.
Performance and Caching
Using resource fonts or downloadable fonts ensures that the Android system can cache typefaces efficiently. Avoid repeatedly loading fonts from assets inside loops or on UI threads.
Best practice:
- Load fonts once and reuse them
- Cache Typeface objects where possible
Accessibility Considerations
- Verify that custom fonts remain legible at different sizes
- Respect user accessibility settings (font scale)
- Use high-contrast fonts for readability
Test fonts across devices and user preference settings.
Common Pitfalls and Fixes
Font not applied on some API levels:
✔ Ensure you use AndroidX Core and correct font resource placement
✔ Use ResourcesCompat.getFont() instead of deprecated methods
App size increases due to large fonts:
✔ Prefer downloadable fonts when possible
✔ Subset font files (trim unused glyphs) if bundling is needed
Incorrect font on rotation or config change:
✔ Avoid reloading fonts repeatedly — use cached references
Best Practices (Senior Engineering Insight)
From real Android development experience:
- Prefer resource fonts for consistency and performance
- Use downloadable fonts to reduce APK size
- Define typography styles once in themes for consistency
- Validate font licenses before bundling
- Test on multiple screen densities and locales
These practices help maintain both quality and efficiency in typography.
Summary
Android provides multiple ways to use external fonts in views:
- Resource fonts (
res/font/) for local, bundled fonts - Programmatic typefaces for dynamic control
- Downloadable fonts via Google Fonts for lighter APKs
- Custom views with font attributes for reusable components
Applying external fonts fosters better design consistency and aligns your UI with brand or readability goals. By using the patterns shown here and following best practices, you can implement robust and flexible typography in Android.


