Android Oreo 字体系列 NPE 崩溃

Posted

技术标签:

【中文标题】Android Oreo 字体系列 NPE 崩溃【英文标题】:Android Oreo Font Family NPE Crash 【发布时间】:2017-09-20 08:52:12 【问题描述】:

我正在使用 API 26 中引入的新 android Font support,并在支持库的版本 26 中向后移植。

我创建了两个字体的font_family.xml,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<font-family
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

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

    <font
        android:font="@font/bold_font"
        android:fontStyle="normal"
        android:fontWeight="700"
        app:font="@font/bold_font"
        app:fontStyle="normal"
        app:fontWeight="700"/>

</font-family>

然后我将它设置在我的活动布局中的 TextView 上,如下所示:

<TextView
        style="@style/TextAppearance.Display1"
        android:layout_
        android:fontFamily="@font/font_family"
        android:textStyle="bold"
        android:layout_ />

这可以在运行 Marshmallow 的 Nexus 5 上以正确的字体工作并呈现 TextView(使用支持库)。但是当我尝试在具有以下堆栈的 Pixel Oreo 设备上运行它时它会崩溃:

Caused by: android.view.InflateException: Binary XML file line #44: Binary XML file line #44: Error inflating class TextView
Caused by: android.view.InflateException: Binary XML file line #44: Error inflating class TextView
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference
    at android.support.v4.graphics.TypefaceCompatApi26Impl.abortCreation(TypefaceCompatApi26Impl.java:202)
    at android.support.v4.graphics.TypefaceCompatApi26Impl.createFromFontFamilyFilesResourceEntry(TypefaceCompatApi26Impl.java:220)
    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)

字体膨胀似乎有些错误,但不能推断出更多。

【问题讨论】:

您使用的是哪个版本的支持库? 支持库 26.0.2 你可以试试26.1.0吗?可能这可能是 26.0.2 中的错误 它对我有用 26.1.0 并且您当前的配置看起来不错 完全清理和重建后与 26.1.0 相同 【参考方案1】:

我和你有同样的问题。所以我从

<font-family xmlns:android="http://schemas.android.com/apk/res/android">
    <font
        android:fontStyle="normal"
        android:fontWeight="400"
        android:font="@font/lobster_regular" />
    <font
        android:fontStyle="italic"
        android:fontWeight="400"
        android:font="@font/lobster_italic" />
</font-family>

<font-family xmlns:android="http://schemas.android.com/apk/res/android">
        <font
            app:fontStyle="normal"
            app:fontWeight="400"
            app:font="@font/lobster_regular" />
        <font
            app:fontStyle="italic"
            app:fontWeight="400"
            app:font="@font/lobster_italic" />
    </font-family>

在我的 lobster_font_family.xml(v26) 中,我在 demolayout.xml 中使用。它在 API 26 上运行没有问题。

【讨论】:

会尝试这个解决方案【参考方案2】:

我发现了我的问题。显然,当我将字体从资产复制到 res/fonts 时,regular_font 没有正确复制并且文件已损坏。将其替换为正确的文件后,它就可以工作了。

这仍然很奇怪,为什么它在 26 之前的设备上工作(使用支持库)并在 Android Oreo 上崩溃(不运行支持库)

【讨论】:

看到同样的错误。您是否真的删除了旧文件并复制了新文件?

以上是关于Android Oreo 字体系列 NPE 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Samsung / Android 8.0 Oreo 更新导致应用程序崩溃? (Xamarin.Forms 应用程序)

Android 8或更高版本使用Firebase Performance SDK在Android Oreo上崩溃的应用程序

尝试提交查询时 Android TV SearchFragment 崩溃(NPE)

应用主题在Oreo 8.1设备上崩溃

android.content.Context.getString 中的 NPE 导致应用程序在启动时崩溃

android Oreo Crash错误