字体系列导致Android 26上的NPE

时间:2017-09-29 09:04:10

标签: android font-family android-8.0-oreo

我的应用程序崩溃在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

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

来自Fonts in XML docs

  

Support Library 26.0support功能提供了Fonts in XML   在运行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

答案 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版本。这是一个错误,或者我没有正确设置可下载字体,即使我使用内置向导添加新字体。

答案 3 :(得分:0)

我有与OP所指的相同的问题,实际上是相同的崩溃堆栈跟踪。

我注意到当我使用Gradle构建时使用27.0.2版本的appcompat支持库时,我已经修复了这个问题。

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

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