字体系列导致 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"/>
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 或更新版本即可。
我的应用程序在 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"/>
The
Support Library 26.0
providessupport
to theFonts in XML
feature on devices running Android APIversion 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 或更新版本即可。