为工具栏使用自定义字体时崩溃

Crash when using custom font for Toolbar

在我的 activity 中,我有一个自定义工具栏。我正在尝试更改其标题字体。

以前,我可以通过将字体放在资产文件夹中来做到这一点。 使用 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: Attempt to read from field 'int android.support.v4.provider.FontsContractCompat$TypefaceResult.mResult' on a null object reference at android.support.v4.provider.FontsContractCompat.onReply(FontsContractCompat.java:277) at android.support.v4.provider.FontsContractCompat.onReply(FontsContractCompat.java:274) at android.support.v4.provider.FontsContractCompat.onReply(FontsContractCompat.java:312) at android.support.v4.provider.FontsContractCompat.onReply(FontsContractCompat.java:300) at android.support.v4.provider.SelfDestructiveThread.run(SelfDestructiveThread.java:149) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:158) at android.app.ActivityThread.main(ActivityThread.java:7225) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

这是错误还是有通过 xml 加载字体的正确方法? 我知道另一种方法是以编程方式加载字体并使用侦听器在文本上设置字体。

**编辑:在第二个应用程序 运行 上,没有发生崩溃(因为字体已经下载)。出于测试目的,我在每次崩溃后更改字体以进行调试...

根据 docs 你应该在使用支持库 26 时使用 app 命名空间:

When you declare font families in XML layout through the support library, use the app namespace.

所以在你的代码中:

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

当用户在设备上没有互联网且之前未下载此字体时尝试使用可下载字体启动应用程序时会发生问题。然后应用程序将启动,但只有在 ~5-10 秒后才会发生崩溃。我想什么时候会发生 http 超时。

所以我没有解决方案,因此 使用 xml-fonts 代替 可下载字体,参见 https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html

仅供参考:所有可下载的字体都已加载到 /data/data/com.google.android.gms/files/fonts 文件夹到您的设备上,如果您的设备已获得 root 权限,则很容易删除并重现此问题那一次。

编辑:从支持库的 27.1.0 版开始,该问题似乎已得到修复。

这似乎是一个支持库问​​题。 Google 开发人员表示该修复程序应该在当前未发布的版本 27.0.2 之后可用。

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

当您 运行 在没有任何互联网连接的情况下首次使用该应用程序时,可能会发生此问题。请检查您的互联网连接并重试。