Android Oreo字体系列NPE崩溃

时间:2017-09-20 08:52:12

标签: android android-layout fonts textview android-8.0-oreo

我使用了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_width="wrap_content"
        android:fontFamily="@font/font_family"
        android:textStyle="bold"
        android:layout_height="wrap_content" />

这可以在运行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)

看起来有些夸大字体的错误但不能推断出更多。

2 个答案:

答案 0 :(得分:2)

我和你有同样的问题。所以我改变了

<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上工作。

答案 1 :(得分:0)

我发现了我的问题。显然,当我将资源中的字体复制到res / fonts时,regular_font没有正确复制并且文件已损坏。用适当的文件替换它之后就可以了。

这仍然很奇怪,为什么这适用于pre-26设备(使用支持lib)并在Android Oreo上崩溃(未运行支持lib)