Сбой при использовании настраиваемого шрифта для панели инструментов
В моей деятельности у меня есть настраиваемая панель инструментов. Я пытаюсь изменить шрифт названия.
Раньше я был в состоянии сделать это, поместив шрифт в папку с активами.
С 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>