【问题标题】:VectorDrawableCompat Resources$NotFoundException on KitKat and belowKitKat 及以下版本的 VectorDrawableCompat Resources$NotFoundException
【发布时间】:2016-06-17 01:56:42
【问题描述】:

当我启用时

vectorDrawables.useSupportLibrary = true

我在 KitKat 及以下设备上收到很多 resourceNotFoundExceptions。我为菜单的 NavigationView 以及带有 app:srcCompat 的 ImageViews 得到了这个

android.content.res.Resources$NotFoundException: Resource ID #0x7f02006b
at android.content.res.Resources.getValue(Resources.java:2305)
at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:268)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:178)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:173)
at android.support.v7.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:421)
at android.support.v7.view.menu.ActionMenuItemView.initialize(ActionMenuItemView.java:114)
at android.support.v7.widget.ActionMenuPresenter.bindItemView(ActionMenuPresenter.java:206)
at android.support.v7.view.menu.BaseMenuPresenter.getItemView(BaseMenuPresenter.java:182)
at android.support.v7.widget.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:192)
at  android.support.v7.widget.ActionMenuPresenter.flagActionItems(ActionMenuPresenter.java:480)
at android.support.v7.view.menu.MenuBuilder.flagActionItems(MenuBuilder.java:1138)
at android.support.v7.view.menu.BaseMenuPresenter.updateMenuView(BaseMenuPresenter.java:91)
at android.support.v7.widget.ActionMenuPresenter.updateMenuView(ActionMenuPresenter.java:229)
at android.support.v7.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:284)
at android.support.v7.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:1030)
at android.support.v7.view.menu.MenuBuilder.startDispatchingItemsChanged(MenuBuilder.java:1053)
at android.support.v7.app.AppCompatDelegateImplV7.preparePanel(AppCompatDelegateImplV7.java:1345)
at android.support.v7.app.AppCompatDelegateImplV7.doInvalidatePanelMenu(AppCompatDelegateImplV7.java:1583)
at android.support.v7.app.AppCompatDelegateImplV7.access$100(AppCompatDelegateImplV7.java:89)
at android.support.v7.app.AppCompatDelegateImplV7$1.run(AppCompatDelegateImplV7.java:128)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5653)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:110)

导航视图

Process: org.ligi.gobandroid_hd, PID: 11473
java.lang.RuntimeException: Unable to start activity ComponentInfo{org.ligi.gobandroid_hd/org.ligi.gobandroid_hd.ui.game_setup.GoSetupActivity}: android.view.InflateException: Binary XML file line #20: Error inflating class android.support.design.widget.NavigationView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2404)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2464)
    at android.app.ActivityThread.access$900(ActivityThread.java:172)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:146)
    at android.app.ActivityThread.main(ActivityThread.java:5653)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.view.InflateException: Binary XML file line #20: Error inflating class android.support.design.widget.NavigationView
    at android.view.LayoutInflater.createView(LayoutInflater.java:626)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129)
    at org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity.setContentView(GobandroidFragmentActivity.java:85)
    at org.ligi.gobandroid_hd.ui.GoActivity.onCreate(GoActivity.java:108)
    at android.app.Activity.performCreate(Activity.java:5541)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2368)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2464) 
    at android.app.ActivityThread.access$900(ActivityThread.java:172) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:146) 
    at android.app.ActivityThread.main(ActivityThread.java:5653) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
    at dalvik.system.NativeStart.main(Native Method) 
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:600)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
    at org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity.setContentView(GobandroidFragmentActivity.java:85) 
    at org.ligi.gobandroid_hd.ui.GoActivity.onCreate(GoActivity.java:108) 
    at android.app.Activity.performCreate(Activity.java:5541) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2368) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2464) 
    at android.app.ActivityThread.access$900(ActivityThread.java:172) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:146) 
    at android.app.ActivityThread.main(ActivityThread.java:5653) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
    at dalvik.system.NativeStart.main(Native Method) 
 Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f020067
    at android.content.res.Resources.getValue(Resources.java:2305)
    at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:268)
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:178)
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:173)
    at android.support.v7.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:421)
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.prepareMenuItems(NavigationMenuPresenter.java:475)
    at android.support.design.internal.NavigationMenuPresenter$NavigationMenuAdapter.update(NavigationMenuPresenter.java:436)
    at android.support.design.internal.NavigationMenuPresenter.updateMenuView(NavigationMenuPresenter.java:112)
    at android.support.design.widget.NavigationView.inflateMenu(NavigationView.java:241)
    at android.support.design.widget.NavigationView.<init>(NavigationView.java:169)
    at android.support.design.widget.NavigationView.<init>(NavigationView.java:95)
    at java.lang.reflect.Constructor.constructNative(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:600) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
    at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:267) 
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:129) 
    at org.ligi.gobandroid_hd.ui.application.GobandroidFragmentActivity.setContentView(GobandroidFragmentActivity.java:85) 
    at org.ligi.gobandroid_hd.ui.GoActivity.onCreate(GoActivity.java:108) 
    at android.app.Activity.performCreate(Activity.java:5541) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1093) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2368) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2464) 
    at android.app.ActivityThread.access$900(ActivityThread.java:172) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1308) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:146) 
    at android.app.ActivityThread.main(ActivityThread.java:5653) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
    at dalvik.system.NativeStart.main(Native Method) 

【问题讨论】:

标签: android android-appcompat android-vectordrawable


【解决方案1】:

要支持 Lollipop 之前的版本,请使用

com.android.support:appcompat-v7:24.0.0(或更高版本)

支持库。

然后,而不是

ContextCompat.getDrawable(view.getContext(), id);

用这个

AppCompatResources.getDrawable(view.getContext(), id);

【讨论】:

  • 非常感谢 - 这对我们有用。你是怎么知道的?
  • 注意:AppCompatDrawableManager 是一个私有 API,因此它随时可能被破坏。见:code.google.com/p/android/issues/detail?id=216903#c13
  • 我遇到了同样的问题,然后我发现支持库已更新,并且在任何地方都没有提及....通过android开发人员错误列表我发现...
【解决方案2】:

我发现了问题:我在 drawable-anydpi/ 中有我的矢量可绘制对象 - 这会导致崩溃 - 当我将可绘制对象移动到可绘制对象/时,它工作正常

【讨论】:

  • 谢谢!这是真正的答案。
  • 谢谢,从 drawable 转移到 drawable-nodpi 为我工作。
  • 这对我也有帮助!
【解决方案3】:

我能够在 pre-Lollipop 设备上使用矢量可绘制对象,方法是将它们包装在 StateListDrawable(选择器)中。

更准确地说,我在 XML 中创建了一个可绘制的选择器,然后在其中添加了一个单矢量可绘制

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/vector_ic_action_add" />
</selector>

然后我在我的菜单中使用这个“包装的”drawable。如果您想了解有关其工作原理的更多信息,请查看 Chris Banes 的 this 非常有用的帖子。

【讨论】:

  • 即使像这样包装可绘制对象,我也会遇到异常
  • 我爱你,伙计:)它的工作!!!!!!!我有这个问题大约 7 天,总是搜索问题♥♥♥
  • 此解决方案不适用于 support-library v 25.3.1 请改用此解决方案stackoverflow.com/a/38507596/4579783
【解决方案4】:

要解决这个问题,我必须在应用程序启动时添加以下代码(应用程序子类):

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

除了:

  • 在布局定义中使用app:srcCompat(在我的例子中是ImageButton 视图)而不是android:src
  • 在 gradle 中激活:vectorDrawables.useSupportLibrary = true

【讨论】:

  • 这个答案解决了我的问题。非常感谢:)
【解决方案5】:

据我在文档中阅读,ImageView 只有 XML 访问权限。

对于必须在 java 中使用的菜单。

toolbar.inflateMenu(menuResId);
toolbar.getMenu()
       .findItem(menuItemId)
       .setIcon(VectorDrawableCompat
                       .createFromResource(resource, drawableId);

【讨论】:

  • 我在文档上也没有看到任何东西 - 但由于这基本上是由 appcompat 绘制的,我想知道是否有一些我不知道的自动操作 - 菜单项是一个很大的用例对于 VectorDrawables - 添加此解决方法会使代码变得丑陋
  • hm - @chrisbanes 在他的博客文章的 cmets 中指出“菜单项工作正常。您如何尝试将其与偏好一起使用?”
  • 我不必添加它,我的菜单项开箱即用,没有任何 XML 更改。我正在使用 23.0.4 的支持库。
【解决方案6】:

如果您使用 vectorDrawableComapt 并在 XML 中设置它,请记住以正确的方式进行:

app:srcCompat="@drawable/ic_add"

来源: https://android-developers.blogspot.co.uk/2016/02/android-support-library-232.html

【讨论】:

  • 这仅与ImageView 相关,而不是您所指的一般 XML。
【解决方案7】:

我遇到了同样的问题,但浪费了几个小时后解决了这个问题

  1. 删除可绘制对象确保只有可绘制对象
  2. 在 build.gradle 中使用

    defaultConfig {vectorDrawables.useSupportLibrary = true}

    1. 如下所示将设置矢量绘制到 ImageView
      <ImageView android:id="@+id/ivLogo" android:layout_width="100dp" android:layout_height="100dp" android:background="@drawable/your_selector" app:srcCompat="@drawable/ic_your_vector_logo" />

    2. 您的 Activity 必须扩展 AppCompatActivity 而不是 Activity

希望你的问题解决了。

【讨论】:

    【解决方案8】:

    对我来说,我将样式参考用于纯色?colorAccent 用于形状。它在 KitKat 上崩溃,但不在上面。更新为使用实际的颜色代码,它就消失了。 &lt;solid android:color="#7885cb" /&gt;

    【讨论】:

      【解决方案9】:

      一个问题可能是向量本身。我的一条路径长 4k 个字符,虽然有警告,但我只是忽略了它。虽然预览很好,但它会在运行时崩溃。

      【讨论】:

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