字体系列导致 android 26 上的 NPE

Font Family cause NPE on android 26

我的应用程序在 android 26 崩溃,我的理解是它是由 font-family 和支持库引起的,但我不明白为什么。 在 Android 8.0 以下的设备上它工作正常。

Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class Button
Caused by: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at android.support.v4.graphics.TypefaceCompatApi26Impl.addFontFromAssetManager(TypefaceCompatApi26Impl.java:150)
at android.support.v4.graphics.TypefaceCompatApi26Impl.createFromFontFamilyFilesResourceEntry(TypefaceCompatApi26Impl.java:218)
at android.support.v4.graphics.TypefaceCompat.createFromResourcesFamilyXml(TypefaceCompat.java:116)
at android.support.v4.content.res.ResourcesCompat.loadFont(ResourcesCompat.java:249)
at android.support.v4.content.res.ResourcesCompat.loadFont(ResourcesCompat.java:213)
at android.support.v4.content.res.ResourcesCompat.getFont(ResourcesCompat.java:206)
at android.support.v7.widget.TintTypedArray.getFont(TintTypedArray.java:119)
at android.support.v7.widget.AppCompatTextHelper.updateTypefaceAndStyle(AppCompatTextHelper.java:208)
at android.support.v7.widget.AppCompatTextHelper.loadFromAttributes(AppCompatTextHelper.java:152)
at android.support.v7.widget.AppCompatTextHelperV17.loadFromAttributes(AppCompatTextHelperV17.java:38)
at android.support.v7.widget.AppCompatButton.<init>(AppCompatButton.java:77)
at android.support.v7.widget.AppCompatButton.<init>(AppCompatButton.java:67)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:109)
at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1024)
at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1081)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v4.graphics.TypefaceCompatApi26Impl.addFontFromAssetManager(TypefaceCompatApi26Impl.java:145)
... 42 more
Caused by: java.lang.NullPointerException
at android.graphics.FontFamily.nAddFontFromAssetManager(Native Method)
at android.graphics.FontFamily.addFontFromAssetManager(FontFamily.java:149)
... 44 more

仅使用 xmlns:app 它适用于 android v26

<font
    app:font="@font/cuprum_regular"
    app:fontStyle="normal"
    app:fontWeight="400"/>

来自 Fonts in XML docs

The Support Library 26.0 provides support to the Fonts in XML feature on devices running Android API version 14 and higher.

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

由于您的应用支持 API 14,因此您必须使用 app 命名空间而不是 android

我正在使用 支持库版本 27.0.1 我在 Android Oreo 上遇到了完全相同的崩溃我使用的是可下载字体 https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts.html
我没有使用可下载的字体,而是从 Google 字体网站下载字体并将它们放在 res\fonts 目录中。字体系列 xml 文件保持不变。 我对其进行了测试,它适用于所有 Android 版本。这是一个错误,或者我没有正确设置可下载字体,即使我使用内置向导添加了新字体。

我遇到了与 OP 所指的相同的问题,具有几乎相同的崩溃堆栈跟踪。

当我在使用 Gradle 构建时切换到使用 27.0.2 版本的 appcompat 支持库时,我注意到这对我来说是固定的。

对于可能依赖框架提供的支持库来构建支持 API 字体的应用程序的自定义 AOSP 应用程序开发人员,您可以参考此提交以获取修复:https://android.googlesource.com/platform/frameworks/support/+/d96eeb46571f2d01c63d21d3aee4ba9bf4b10c53

如果您使用 Android Studio/Gradle 进行开发,只需将支持库更新到 27.0.2 或更新版本即可。