Чтобы добавить кастомный шрифт в Android Studio, достаточно положить файл .ttf или .otf в папку res/font и сослаться на него через атрибут android:fontFamily — но именно на этапе именования файла и подключения чаще всего возникают ошибки сборки. Если после добавления шрифта проект перестал компилироваться или текст в приложении не изменился, причина почти всегда в неправильном имени ресурса или неверном пути к файлу.
В этой статье разберём все рабочие способы подключения шрифтов: через папку ресурсов, программно из кода и через Downloadable Fonts из Google Fonts. Также рассмотрим типичные ошибки вроде «resource linking failed» и объясним, почему шрифт может отображаться в превью, но не на устройстве.
Подготовка файла шрифта
Перед добавлением убедитесь, что файл шрифта имеет расширение .ttf (TrueType) или .otf (OpenType) — именно эти форматы поддерживает Android. Файлы .woff и .woff2, распространённые в вебе, напрямую не подойдут, их нужно конвертировать.
Ключевое требование — имя файла. Оно должно состоять только из строчных латинских букв, цифр и подчёркиваний. Имя Roboto-Bold.ttf вызовет ошибку сборки, а roboto_bold.ttf — нет. Это ограничение системы ресурсов Android, и обойти его нельзя.
- 📄 Проверьте расширение: только
.ttfили.otf - 🔤 Переименуйте файл в нижний регистр:
my_font.ttf - 🚫 Уберите дефисы, пробелы, кириллицу и заглавные буквы из имени
- ⚖️ Убедитесь, что лицензия шрифта разрешает встраивание в приложение
⚠️ Внимание: если файл шрифта скачан из интернета, проверьте его лицензию. Многие коммерческие шрифты запрещают встраивание в мобильные приложения без отдельной лицензии, и это юридический риск, а не технический.
Способ 1: добавление шрифта через папку res/font
Это стандартный и рекомендуемый способ, поддерживаемый начиная с Android 8.0 (API 26) и через библиотеку совместимости — на более старых версиях. Откройте проект в режиме отображения Project, кликните правой кнопкой по папке res и выберите New → Android Resource Directory. В поле Resource type укажите font и подтвердите создание.
После этого скопируйте подготовленный файл шрифта в появившуюся папку res/font. Android Studio автоматически проиндексирует ресурс, и он станет доступен по имени файла без расширения: R.font.my_font в коде и @font/my_font в XML.
☑️ Добавление шрифта через res/font
Подключение шрифта в XML-разметке
Самый простой вариант — указать шрифт прямо в атрибутах TextView. Для этого используется атрибут android:fontFamily, значением которого служит ссылка на ресурс:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/my_font"
android:text="Пример текста" />
Если шрифт нужен сразу для нескольких элементов, разумнее вынести его в стиль или тему. Создайте в res/values/styles.xml стиль с атрибутом fontFamily и применяйте его через style="@style/MyTextStyle". Так изменение шрифта во всём приложении потребует правки одной строки.
Подключение шрифта программно
Иногда шрифт требуется установить динамически — например, по настройке пользователя. В Kotlin это делается через ResourcesCompat, который работает и на старых версиях Android:
val typeface = ResourcesCompat.getFont(context, R.font.my_font)
textView.typeface = typeface
Метод ResourcesCompat.getFont() может вернуть null, если ресурс не найден, поэтому в Kotlin результат стоит обрабатывать как nullable. Для Java-синтаксиса логика та же: получаете объект Typeface и присваиваете его текстовому полю через setTypeface().
Обратите внимание: загрузка шрифта — не бесплатная операция. Если один и тот же Typeface применяется ко многим элементам, загрузите его один раз и переиспользуйте объект, а не вызывайте getFont() повторно для каждого TextView.
Способ 2: Downloadable Fonts из Google Fonts
Альтернатива ручному добавлению — Downloadable Fonts. Шрифт не упаковывается в APK, а скачивается системой при первом запуске и кешируется. Это уменьшает размер установочного файла, что особенно заметно при использовании нескольких начертаний.
В Android Studio есть встроенный мастер: в редакторе разметки выделите TextView, найдите атрибут fontFamily в панели атрибутов и в выпадающем списке выберите More Fonts. Откроется окно с каталогом Google Fonts, где можно выбрать шрифт — среда сама создаст необходимые XML-файлы и запись в манифесте.
Что именно создаёт мастер Downloadable Fonts
При выборе шрифта Android Studio генерирует XML-файл в res/font с описанием семейства, добавляет в AndroidManifest.xml мета-данные с массивом сертификатов провайдера шрифтов и создаёт файл res/values/font_certs.xml. Всё это можно отредактировать вручную при необходимости.
⚠️ Внимание: Downloadable Fonts требуют на устройстве поддержку со стороны провайдера шрифтов (обычно это сервисы Google Play). На устройствах без них механизм может не сработать — тестируйте приложение на целевой аудитории устройств или используйте локальное добавление через res/font.
Работа с несколькими начертаниями: Font Family XML
Когда у шрифта есть несколько весов — Regular, Bold, Italic — каждый можно добавить отдельным файлом. Но удобнее объединить их в семейство через XML-описание. Создайте в res/font файл, например my_font_family.xml, со следующим содержимым:
<font-family xmlns:android="http://schemas.android.com/apk/res/android">
<font
android:font="@font/my_font_regular"
android:fontWeight="400"
android:fontStyle="normal" />
<font
android:font="@font/my_font_bold"
android:fontWeight="700"
android:fontStyle="normal" />
</font-family>
После этого при подключении @font/my_font_family система сама подберёт нужный файл по запрошенному textStyle и весу. Атрибут android:textStyle="bold" в разметке автоматически задействует жирное начертание из семейства.
Сравнение способов добавления шрифта
| Способ | Размер APK | Офлайн-работа | Сложность |
|---|---|---|---|
| Папка res/font | Увеличивается | Да | Минимальная |
| Font Family XML | Увеличивается | Да | Средняя |
| Программно (getFont) | Увеличивается | Да | Средняя |
| Downloadable Fonts | Не увеличивается | После первой загрузки | Низкая (мастер) |
Типичные ошибки и их решение
Ошибка «resource linking failed» или «file-based resource names must contain only lowercase a-z, 0-9, or underscore» при сборке означает недопустимое имя файла. Переименуйте файл по правилам из первого раздела и выполните Build → Clean Project, затем Rebuild Project.
Вторая частая ситуация: шрифт виден в превью редактора, но на устройстве текст остаётся системным. Возможные причины — кеш сборки, опечатка в имени ресурса (@font/myfont вместо @font/my_font) или то, что шрифт переопределяется в применённой теме. Проверьте стили и тему активности: атрибут fontFamily в теме имеет приоритет.
- 🧹 Выполните
Clean ProjectиRebuild Project - 🔍 Сверьте имя ресурса в XML с именем файла посимвольно
- 🎨 Проверьте, не переопределяет ли тема приложения
fontFamily - 📱 Протестируйте на реальном устройстве, а не только в превью
⚠️ Внимание: превью в Layout Editor может показывать шрифт, даже если на устройстве он не применится — редактор и система рендерят ресурсы по-разному. Финальную проверку всегда делайте на эмуляторе или физическом устройстве.
Часто задаваемые вопросы
Какие форматы шрифтов поддерживает Android?
Нативно поддерживаются .ttf (TrueType) и .otf (OpenType). Веб-форматы .woff и .woff2 напрямую не работают — их нужно предварительно конвертировать в TTF или OTF.
Почему сборка падает с ошибкой после добавления шрифта?
Наиболее вероятная причина — недопустимое имя файла. Оно должно содержать только строчные латинские буквы, цифры и подчёркивания. Переименуйте файл и выполните пересборку проекта через Build → Rebuild Project.
Можно ли добавить шрифт для всего приложения сразу?
Да. Укажите атрибут android:fontFamily в теме приложения (файл themes.xml или styles.xml) — тогда шрифт применится ко всем текстовым элементам, где он не переопределён явно.
Работают ли кастомные шрифты на старых версиях Android?
Папка res/font и XML-семейства официально поддерживаются с Android 8.0 (API 26). Для более ранних версий используйте ResourcesCompat.getFont() из библиотеки совместимости AndroidX — он обеспечивает обратную совместимость.
Что лучше: локальный шрифт или Downloadable Fonts?
Локальный шрифт надёжнее: он работает офлайн и не зависит от сервисов Google. Downloadable Fonts выигрывает в размере APK, но требует провайдера шрифтов на устройстве. Для приложений с одним-двумя начертаниями локальный вариант обычно предпочтительнее.