Android:为abc_ic_ab_back_material获取Resources $ NotFoundException

时间:2016-07-19 20:14:05

标签: android android-support-library android-toolbar android-resources android-vectordrawable

我在旧的(pre-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.access$600(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.access$600(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.access$600(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)

7 个答案:

答案 0 :(得分:23)

这个问题的答案被隐藏在本指南的底部:

https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88#.xucjbsts0

事实证明,您需要在将使用资源的活动开始时添加此行:

static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

答案 1 :(得分:2)

请确保您使用的是AppCompatActivity而不是Activity。如果你正在使用AppCompat的主题,那么你还需要使用它的Activity。

答案 2 :(得分:1)

另一种解决方案,
除了AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
是将你的矢量drawable包装成另一个drawable:

<?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)的drawable时,它可能很有用

答案 3 :(得分:1)

所有案件均未涵盖接受的答案。 它不适用于具有25.x.x支持库的Android 4.0.3 / 4.1.1 / 4.1.2平台。解决abc_ic_ab_back_material.xml问题的正确方法是覆盖主题中的homeAsUpIndicator属性。例如,我的主题继承自Theme.AppCompat.Light.NoActionBar。至于所提及属性的值,您可以使用@drawable/abc_ic_ab_back_mtrl_am_alpha或您的自定义'返回'drawable。

答案 4 :(得分:0)

私有资源在编译时和运行时区别对待...修复我通常会使用违规私有资源并将其移植到我的res文件中的应用程序

答案 5 :(得分:0)

我在调用ContextCompat.getDrawable()时正在使用应用程序上下文,这也会使应用程序与Resources$NotFoundException崩溃,现在发出以下消息,即使其他所有内容都设置得很好:

  

如果您尝试使用的资源是矢量资源,则可能是   以不受支持的方式引用它。看到   AppCompatDelegate.setCompatVectorFromResourcesEnabled()了解更多信息。

我所要做的只是改为视图Context:)

答案 6 :(得分:0)

尝试使用AppCompatDrawableManager.get()。getDrawable()而不是ContextCompat.getdrawable()