Android:获取 abc_ic_ab_back_material 的 Resources$NotFoundException
Android: getting Resources$NotFoundException for abc_ic_ab_back_material
我在旧的(L 之前的)设备上收到 Resources$notfoundexception。我在下面包括了完整的堆栈跟踪。
我的支持库版本是最新的 (24.1.0),我在 gradle 文件中包含了以下行:
vectorDrawables.useSupportLibrary = true
我的基本主题是 noactionbar 主题 - "Theme.AppCompat.Light.NoActionBar"
崩溃发生在我代码中的这一行,我在支持工具栏中引用了后退箭头以便稍后更改它的颜色:
@SuppressLint("PrivateResource") final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material);
这可能是什么原因造成的?此代码适用于所有具有 L 或更高级别的用户。
07-19 22:36:57.029 9330-9330/mypkg E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {mypkg/mypkg.activites.myActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2619)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4929)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
at android.content.res.Resources.loadDrawable(Resources.java:1957)
at android.content.res.Resources.getDrawable(Resources.java:673)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:354)
at mypkg.base.mymethod(myactivity.java:100)
at mypkg.mymethod(myactivity.java:100)
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:511)
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:178)
at android.app.Activity.performResume(Activity.java:5341)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4929)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
at android.content.res.Resources.loadDrawable(Resources.java:1954)
at android.content.res.Resources.getDrawable(Resources.java:673)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:354)
at mypkg/mymethod(myactivity.java:100)
at mypkg/mymethod(myactivity.java:100)
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:511)
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:178)
at android.app.Activity.performResume(Activity.java:5341)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4929)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
私有资源在编译时和运行时的处理方式不同..为了修复,我通常会使用有问题的私有资源并将其反向移植到我的 res 文件中的应用程序
这个问题的答案竟然埋在本指南的底部:
https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.xucjbsts0
事实证明,您只需要在将使用资源的 activity 的开头添加这一行:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
请确保您使用的是 AppCompatActivity 而不是 Activity。如果您使用的是 AppCompat 的主题,那么您还需要使用它的 Activity.
我在调用 ContextCompat.getDrawable()
时使用了应用程序上下文,这也会使应用程序崩溃 Resources$NotFoundException
现在出现以下消息,即使其他一切都设置得很好:
If the resource you are trying to use is a vector resource, you may be
referencing it in an unsupported way. See
AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.
我所要做的就是更改视图的 Context
。 :)
另一个解决方案,
除了 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
是将您的矢量可绘制对象包装到另一个可绘制对象中:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_your_vector"/>
</selector>
当您用作 TextView 的可绘制对象(即 DrawableLeft)时可能会有用
已接受的答案并未涵盖所有情况。 它不能在 Android 4.0.3/4.1.1/4.1.2 平台上使用 25.x.x 支持库 。解决 abc_ic_ab_back_material.xml
问题的正确方法是覆盖主题中的 homeAsUpIndicator
属性。比如我的主题就是继承自Theme.AppCompat.Light.NoActionBar
。至于提到的属性值,您可以使用 @drawable/abc_ic_ab_back_mtrl_am_alpha
或您自定义的 'back' 可绘制对象。
而不是:
ContextCompat.getdrawable()
尝试使用:
AppCompatDrawableManager.get().getDrawable()
我在旧的(L 之前的)设备上收到 Resources$notfoundexception。我在下面包括了完整的堆栈跟踪。
我的支持库版本是最新的 (24.1.0),我在 gradle 文件中包含了以下行:
vectorDrawables.useSupportLibrary = true
我的基本主题是 noactionbar 主题 - "Theme.AppCompat.Light.NoActionBar"
崩溃发生在我代码中的这一行,我在支持工具栏中引用了后退箭头以便稍后更改它的颜色:
@SuppressLint("PrivateResource") final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material);
这可能是什么原因造成的?此代码适用于所有具有 L 或更高级别的用户。
07-19 22:36:57.029 9330-9330/mypkg E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to resume activity {mypkg/mypkg.activites.myActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2619)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4929)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
at android.content.res.Resources.loadDrawable(Resources.java:1957)
at android.content.res.Resources.getDrawable(Resources.java:673)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:354)
at mypkg.base.mymethod(myactivity.java:100)
at mypkg.mymethod(myactivity.java:100)
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:511)
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:178)
at android.app.Activity.performResume(Activity.java:5341)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4929)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:877)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:818)
at android.content.res.Resources.loadDrawable(Resources.java:1954)
at android.content.res.Resources.getDrawable(Resources.java:673)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:354)
at mypkg/mymethod(myactivity.java:100)
at mypkg/mymethod(myactivity.java:100)
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:511)
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:178)
at android.app.Activity.performResume(Activity.java:5341)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2599)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2104)
at android.app.ActivityThread.access0(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4929)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565)
at dalvik.system.NativeStart.main(Native Method)
私有资源在编译时和运行时的处理方式不同..为了修复,我通常会使用有问题的私有资源并将其反向移植到我的 res 文件中的应用程序
这个问题的答案竟然埋在本指南的底部:
https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.xucjbsts0
事实证明,您只需要在将使用资源的 activity 的开头添加这一行:
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
请确保您使用的是 AppCompatActivity 而不是 Activity。如果您使用的是 AppCompat 的主题,那么您还需要使用它的 Activity.
我在调用 ContextCompat.getDrawable()
时使用了应用程序上下文,这也会使应用程序崩溃 Resources$NotFoundException
现在出现以下消息,即使其他一切都设置得很好:
If the resource you are trying to use is a vector resource, you may be referencing it in an unsupported way. See AppCompatDelegate.setCompatVectorFromResourcesEnabled() for more info.
我所要做的就是更改视图的 Context
。 :)
另一个解决方案,
除了 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
是将您的矢量可绘制对象包装到另一个可绘制对象中:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_your_vector"/>
</selector>
当您用作 TextView 的可绘制对象(即 DrawableLeft)时可能会有用
已接受的答案并未涵盖所有情况。 它不能在 Android 4.0.3/4.1.1/4.1.2 平台上使用 25.x.x 支持库 。解决 abc_ic_ab_back_material.xml
问题的正确方法是覆盖主题中的 homeAsUpIndicator
属性。比如我的主题就是继承自Theme.AppCompat.Light.NoActionBar
。至于提到的属性值,您可以使用 @drawable/abc_ic_ab_back_mtrl_am_alpha
或您自定义的 'back' 可绘制对象。
而不是:
ContextCompat.getdrawable()
尝试使用:
AppCompatDrawableManager.get().getDrawable()