字体家族在Android 26上引起NPE异常

9

我的App在Android 26上崩溃,我理解是由于字体和支持库引起的,但我不知道为什么。 在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
4个回答

6
只使用xmlns:app,适用于Android v26。
<font
    app:font="@font/cuprum_regular"
    app:fontStyle="normal"
    app:fontWeight="400"/>

3

XML文档中的字体开始,Support Library 26.0为在运行Android API 14和更高版本的设备上提供Fonts in XML功能。

当您通过支持库在XML布局中声明字体系列时,请使用app命名空间。

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


1

我遇到了与原帖作者提到的相同问题,几乎相同的崩溃堆栈。

当我使用Gradle构建时,我注意到这个问题在我切换到使用27.0.2版本的appcompat支持库时得到了解决。

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

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接