Как программно установить Google Fonts .xml в TextView

Поскольку в Android Studio 3.0 вы можете просто интегрировать шрифты Google в свой проект (см. Пошаговое руководство по Android).

Когда вы добавляете какой-либо шрифт, Android Studio генерирует вам папку со шрифтом, включая XML-файл для шрифта (в моем случае amatic_sc.xml). Также Studio создает preloaded_fonts.xml в папке значений.

amatic_sc.xml:

<?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="Amatic SC"
        app:fontProviderCerts="@array/com_google_android_gms_fonts_certs">
</font-family>

preloaded_fonts.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="preloaded_fonts" translatable="false">
        <item>@font/amatic_sc</item>
    </array>
</resources>

Когда я включаю следующую статическую строку в мой XML-файл, она работает нормально:

android:fontFamily="@font/amatic_sc"

Но в моем случае мне нужно программно установить семейство шрифтов в моем собственном адаптере listAdapter. Я попробовал следующие примеры кода, но ничего не работает:

// Display text with default fontFamily
viewHolder.textView.setTypeface(Typeface.create("@font/amatic_sc", Typeface.NORMAL));

// both throws java.lang.RuntimeException: Font asset not found [../res/]font/amatic_sc.xml
viewHolder.textView.setTypeface(Typeface.createFromAsset(context.getAssets(), "font/amatic_sc.xml"));
viewHolder.textView.setTypeface(Typeface.createFromAsset(context.getAssets(), "../res/font/amatic_sc.xml"));

// both throws java.lang.RuntimeException: Font asset not found [../res/]font/amatic_sc.xml
viewHolder.textView.setTypeface(Typeface.createFromFile("font/amatic_sc.xml"));
viewHolder.textView.setTypeface(Typeface.createFromFile("../res/font/amatic_sc.xml"));

В моем случае я использую min SDK версии 16 и надеюсь, что мой фрагмент кода будет достаточным.

Спасибо за помощь!

2 ответа

Вы можете использовать библиотеку поддержки для совместимости с версиями Android до 8, например:

Typeface typeface = ResourcesCompat.getFont(context,R.font.amatic_sc);
viewHolder.textView.setTypeface(typeface);

Больше информации здесь.

Сохраните файл шрифта в папке активов, затем используйте этот фрагмент

Typeface font = Typeface.createFromAsset(mContext.getAssets(), fontPath);
v.setTypeface(font);

notic: путь к шрифту должен

Roboto-Bold.ttf

Другие вопросы по тегам