Сбой при использовании настраиваемого шрифта для панели инструментов

В моей деятельности у меня есть настраиваемая панель инструментов. Я пытаюсь изменить шрифт названия.

Раньше я был в состоянии сделать это, поместив шрифт в папку с активами. С Android Studio 3 мы теперь можем использовать fontFamily и FontsContract. Я пробовал этот подход с помощью кода ниже:

mToolbar.setTitleTextAppearance(context,R.style.AppTheme_ActionBarText);

и стиль

<style name="AppTheme.ActionBarText" parent="@android:style/Widget.ActionBar.TabText">
            <item name="fontFamily">@font/ultra</item>
        </style>

Когда я запустил приложение, через несколько секунд (время, необходимое для загрузки пользовательского шрифта), приложение выходит из строя с журналом ниже:

java.lang.NullPointerException: попытка чтения из поля 'int android.support.v4.provider.FontsContractCompat $TypefaceResult.mResult" по ссылке на нулевой объект                       на android.support.v4.provider.FontsContractCompat $2.onReply(FontsContractCompat.java:277)                       на android.support.v4.provider.FontsContractCompat $2.onReply(FontsContractCompat.java:274)                       на android.support.v4.provider.FontsContractCompat $3.onReply(FontsContractCompat.java:312)                       на android.support.v4.provider.FontsContractCompat $3.onReply(FontsContractCompat.java:300)                       на android.support.v4.provider.SelfDestructiveThread $2 $1.run(SelfDestructiveThread.java:149)                       на android.os.Handler.handleCallback(Handler.java:739)                       на android.os.Handler.dispatchMessage(Handler.java:95)                       на android.os.Looper.loop(Looper.java:158)                       at android.app.ActivityThread.main(ActivityThread.java:7225)                       в java.lang.reflect.Method.invoke(собственный метод)                       at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:1230)                       в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Является ли это ошибкой или есть правильный способ загрузить шрифт через xml? Я знаю, что другой способ - загрузить шрифт программно и использовать прослушиватель для установки шрифта в тексте.

** РЕДАКТИРОВАТЬ: во втором запуске приложения авария не происходит (поскольку шрифт уже загружен). В целях тестирования я меняю шрифт после каждого сбоя, чтобы отлаживать...

Ответ 1

Проблема возникает, когда пользователь пытается запустить приложение с загружаемыми шрифтами, когда на устройстве нет Интернета, и эти шрифты не были загружены ранее. Затем приложение запустится, но сбой произойдет только после ~ 5-10 секунд. Я думаю, когда произойдет таймаут http.

Итак, у меня нет решения, поэтому используйте вместо xml-шрифтов загружаемые шрифты, см. https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

FYI: все загружаемые шрифты загружены в папку /data/data/com.google.android.gms/files/fonts на ваши устройства. Если у вас есть внедренное устройство, тогда легко удалить и воспроизвести эту проблему больше,.

Ответ 2

Изменить: похоже, проблема исправлена ​​с версии 27.1.0 библиотеки поддержки.

Это, по-видимому, проблема с библиотекой поддержки. Разработчики Google указали, что исправление должно быть доступно после версии 27.0.2, которая в настоящее время не выпущена.

https://issuetracker.google.com/issues/69085400

Ответ 3

В соответствии с docs вы должны использовать пространство имен app при использовании библиотеки поддержки 26:

Когда вы объявляете семейства шрифтов в макете XML через библиотеку поддержки, используйте пространство имен приложений.

Итак, в вашем коде:

    <item name="app:fontFamily">@font/ultra</item>