【问题标题】:Android: getting Resources$NotFoundException for abc_ic_ab_back_materialAndroid:为 abc_ic_ab_back_material 获取 Resources$NotFoundException
【发布时间】:2016-11-22 21:19:36
【问题描述】:

我在较旧的(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)

【问题讨论】:

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


    【解决方案1】:

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

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

    事实证明,您只需要在将使用该资源的活动的开头添加这一行:

    static {
            AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
        }
    

    【讨论】:

    • 我无法让它工作。添加了您提到的行,但应用程序仍然崩溃。堆栈跟踪与您的问题相同。
    • 您是否也将 useSupportLibrary 行添加到 gradle 文件中,并且您使用的是最新的支持库版本吗?
    • 是的。我猜,这个问题是因为你的解决方案只适用于活动,扩展 AppCompatActivty,但我的是 PreferenceActivity。
    • 谢谢!使用 AppCompatDelegate 并没有解决崩溃,通过使用我添加了正常的工具栏,现在不需要图标。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      另一种解决方案,
      除了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)时可能很有用

      【讨论】:

        【解决方案4】:

        接受的答案并未涵盖所有情况。 它不适用于具有 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 或者你自定义的'back'drawable。

        【讨论】:

          【解决方案5】:

          私有资源在编译时和运行时的处理方式不同..为了解决问题,我通常会采用有问题的私有资源并将其反向移植到我的 res 文件中的应用程序

          【讨论】:

          • 谢谢。我试图获取资源并在我的 drawables 文件夹中创建它。它抱怨找不到资源,所以我更改了名称以确保它不会尝试引用支持库版本 - 它仍然抱怨找不到资源。
          • 当您移植它时,您必须更改您所指的命名空间,因为它不再是 android anmespace
          【解决方案6】:

          我在调用 ContextCompat.getDrawable() 时使用了应用程序上下文,这也使应用程序因Resources$NotFoundException 而崩溃,现在即使其他所有设置都很好,但现在出现以下消息:

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

          我所要做的就是更改视图的Context :)

          【讨论】:

            【解决方案7】:

            代替:

            ContextCompat.getdrawable()
            

            尝试使用:

            AppCompatDrawableManager.get().getDrawable() 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-09-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多