【问题标题】:Support library VectorDrawable Resources$NotFoundException支持库 VectorDrawable Resources$NotFoundException
【发布时间】:2016-10-03 14:01:45
【问题描述】:

我正在使用设计支持库版本 23.4.0。我已启用 gradle 标志:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

我正在使用构建工具版本 23.0.2,但我仍然在 KitKat 或更低版本上获得 Resources$NotFoundException

当我使用android:drawableLeftimageView.setImageResource(R.drawable.drawable_image) 时会发生这种情况。

是的,我把它放在我使用可绘制对象的每一个活动中

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

这是支持库的错误吗?

【问题讨论】:

  • 面临和你一样的问题。你有解决 android:drawableLeft 的办法吗?
  • @Sayem 不,我必须完全从按钮中删除图形。虽然您可以提供单独的 png 作为可绘制对象。
  • 是的..我已经按照你的建议做了。

标签: android android-support-library androiddesignsupport android-vectordrawable


【解决方案1】:

使用 support library 23.4.0,我花了 3 件不同的事情来让它工作:

  1. 将此添加到build.gradle

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
  2. 将以下内容添加到您的Application 类的onCreate

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    

    (来自此链接的参考 - “https://stackoverflow.com/a/45582033/10752962”)

    API小于21中,在setContentView()之前使用这一行;

  3. 对于您设置矢量可绘制替换的所有 XML 视图

    android:src
    

    app:srcCompat
    

    并在代码中替换:

    imageView.setImageResource(...);
    

    imageView.setImageDrawable(...);
    

【讨论】:

  • 即使我的活动基于 AppCompatActivity,这是否适用? AppCompatActivity 已经使用 AppCompatDelegate。
  • 只需使用AppCompatImageView 而不是ImageView。问题解决了。无需为较低版本保留 png。甚至不需要srcCompat
  • 我已经完成了第 1 步到第 3 步(第三步使用了app:srcCompat)。但是,我仍然看到一个异常XmlPullParserException: Binary XML file line #4: invalid drawable tag vector。这个 KitKat 设备似乎无法识别 XML 中的 vector 标记?
  • 为什么要用seImageDrawable替换setImageResource
  • 如果您使用imageView.setImageResource(...),则不需要AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)。使用 25.3.1 支持库测试。
【解决方案2】:

为了补充这里的一些答案:对 VectorDrawables 的向后兼容支持是有代价的,并且并非在所有情况下都有效

在哪些情况下有效?我已经让this diagram 提供帮助(对支持库 23.4.0 到至少 25.1.0 有效)。

【讨论】:

【解决方案3】:

尝试使用:

imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));

您不必添加AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 这边。

只需使用 VectorDrawableCompat 为您的矢量可绘制对象充气,一切就绪。

【讨论】:

  • 这有 2 个 args 而不是 3 个:AppCompatDrawableManager.get().getDrawable(context, resId);
【解决方案4】:

我们遇到了同样的问题。在 Kitkat 上看不到矢量绘图。我通过在活动的 onCreate 方法中添加 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 解决了这个问题。

在此之前不要忘记添加:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

并为使用矢量可绘制对象的视图调用 setImageResource。我的观点是 ImageButton。我有 Android SDK 构建工具版本 23.0.3

【讨论】:

  • 我的问题是即使AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 也不起作用。同样的 ResourceNotFound 异常。
  • @Arka 你可以尝试调用Activity的onCreate方法。
  • 您应该能够将它添加到您的应用程序类的 onCreate 中。这似乎对我有用。
【解决方案5】:

很抱歉迟到了,但这个答案可能对想要为所有活动启用标志 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 的用户有所帮助。

1.创建一个扩展为 Application (android.app.Application) 的类

public class MyApplicationClass extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}

2。前往 Manifest.xml 并将以下行添加到您的标签中

<application
    android:name=".MyApplicationClass"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    ...
</application>

3.在 MyApplicationClass.java 中的 onCreate 上面添加如下代码

// This flag should be set to true to enable VectorDrawable support for API < 21
static
{
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

MyApplicationClass.java 的完整代码

import android.app.Application;
import android.support.v7.app.AppCompatDelegate;

/**
* Created by Gaurav Lonkar on 23-Dec-17.
*/

public class MyApplicationClass extends Application
{
    // This flag should be set to true to enable VectorDrawable support for API < 21
    static
    {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}

【讨论】:

    【解决方案6】:
    defaultConfig {
      vectorDrawables.useSupportLibrary = true
    }
    

    在 app.gradle 中使用它

    然后使用AppCompatDrawableManager来setDrawable和getDrawable。为我工作

    【讨论】:

      【解决方案7】:

      在支持库 23.3 中禁用了对 android:drawableLeft 等位置的矢量可绘制对象的支持。在Google+宣布:

      我们决定删除允许您使用矢量的功能 由于发现的问题,从棒棒糖前设备上的资源中提取 在版本 23.2.0/23.2.1 的实现中。使用 app:srcCompat 和 setImageResource() 继续工作。

      问题链接:

      但是,如果您可以解决这些问题,在 23.4 中,您可以使用 AppCompatDelegate.setCompatVectorFromResourcesEnabled() 重新启用此功能。

      如果您对它的工作原理感到好奇,最好向 Chris Banes 学习,他是此功能的作者。他详细解释on his blog

      【讨论】:

        【解决方案8】:

        改变

        imageView.setImageResource(R.drawable.drawable_image)
        

        imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image));
        

        如果你想在 xml 中使用 vectordrawable,使用这个:

        app:srcCompat="@drawable/drawable_image"
        

        【讨论】:

        • 您的方法 setImageDrawable 有效。但仍然按钮 drawableLeft 不起作用。
        • 这会导致旧设备崩溃。
        • 这不起作用。请在此处改用其他答案之一。
        • 你应该在你的 build.gradle 和这个 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) 上有这个 vectorDrawables.useSupportLibrary = true;在您的应用程序类的 onCreate 或 {AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); } 关于你的活动。检查问题。在他问之前,他在代码中添加了这些行
        【解决方案9】:

        我很久以前也遇到过类似的问题,设置了也没用

        vectorDrawables.useSupportLibrary = true

        仅在我创建“mipmap”文件夹和使用的代码时有效

        imageView.setImageResource (R.mipmap.drawable_image)

        它有更多信息here

        【讨论】:

          【解决方案10】:


          为 Drawable 充气

          这个支持库中的`VectorDrawable``AnimatedVectorDrawable`可以这样膨胀:

          • 调用静态getDrawable()方法:
          //这只会膨胀一个以为根元素的drawable
          VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector);
          
          //这只会膨胀一个以  作为根元素的drawable
          AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector);
          
          // 这将膨胀任何可绘制对象并自动回退到 api 21+ 设备上的棒棒糖实现
          ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

          如果在 java 代码中对 Drawable 进行膨胀,建议始终使用 ResourcesCompat.getDrawable(),因为这会在适用时处理 Lollipop 回退。这允许系统缓存 Drawable ConstantState,因此效率更高。
          该库具有以下变形(双向​​)动画:

        • 播放-暂停变形动画
        • 播放停止变形动画
        • Arrow-Hamburger 菜单变形动画

        • 如您所见,我在API 16 手机上制作了上图:
          import com.wnafee.vector.compat.AnimatedVectorDrawable;
          mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);
          

          在这里查看vector-compat 的github READMEhttps://github.com/wnafee/vector-compat
          如果您将其与应用模块的 build.gradle dependencies 合并(通常在文件末尾),这将解决您的问题(直至 API 14):

          dependencies {
          compile fileTree(dir: 'libs', include: ['*.jar'])
          //Trying to FIX Binary XML file line #2: invalid drawable tag animated-vector
              compile 'com.android.support:appcompat-v7:25.0.0'
              compile 'com.android.support:design:25.0.0'
          //not needed
          //  compile 'com.android.support:support-vector-drawable:25.0.0'
              compile 'com.wnafee:vector-compat:1.0.5'//*******holy grail *******https://github.com/wnafee/vector-compat
          //  Failed to resolve: com.android.support:support-animated-vector-drawable:25.0.0
          //not needed
          //  compile 'com.android.support:support-animated-vector-drawable:25.0.0'
          }
          

          【讨论】:

            【解决方案11】:

            不要把你的向量放在drawable-anydpi ,旧设备不支持该功能

            把它们放在drawable

            【讨论】:

            • 这对我有用。
            【解决方案12】:

            在我的特定情况下,我遇到了这个问题,因为我使用可绘制选择器作为图像资源,选择器中有多个矢量,如下所示:

            <selector xmlns:android="http://schemas.android.com/apk/res/android">
                <item android:state_selected="true" android:drawable="@drawable/vector_select_blue"/>
                <item android:state_pressed="true" android:drawable="@drawable/vector_select_black"/>
                .
                .
                etc
            </selector>
            

            是的,很糟糕,但当时并不知道。

            因此,正确的做法是在矢量文件中使用 tint 属性,如下所示:

            <vector ..vector properties..
                    android:tint="@color/vector_color_selector">
                          <path ..path properties../>
            </vector>
            

            (也可以在AppCompatImageView中使用app:tint属性)

            现在,你的 vector_color_selector 文件应该有你想要的颜色,如下所示:

            <selector xmlns:android="http://schemas.android.com/apk/res/android">
                <item android:state_selected="true" android:color="@color/blue"/>
                <item android:state_pressed="true" android:color="@color/black"/>
                .
                .
                etc
            </selector>
            

            如果以前的答案对您不起作用,我希望这对某人有所帮助。说的很明显,但我必须说你仍然需要在 gradle 中设置 vectorDrawables.useSupportLibrary = true ,使用 AppCompatImageView 并使用 app:srcCompat 或 setImageDrawable + AppCompatResources.getDrawable 以避免向量兼容库的任何麻烦。

            【讨论】:

              【解决方案13】:

              如 Harish Gyanani 在 cmets 中所说,使用 AppCompatImageView 而不是 ImageView,这对我来说效果很好。

              Official docs

              【讨论】:

                【解决方案14】:

                我遇到了同样的问题,实际上缺少的是我在 AppCompatTextView 上使用了 app:srcCompat,但 AppCompatImageView 除外。

                我找到问题部分的方式:

                我的错误如下:

                Fatal Exception: android.content.res.Resources$NotFoundException
                Resource ID #0x7f0700d1
                

                以下是我按照上述可绘制对象的资源 ID 执行的步骤:

                • APK 分析器 -> classesXXX.dex
                • 在这个 dex 文件中,我打开了我的应用程序包名称的目录,然后转到 R$drawable 文件
                • R$drawable -> 显示为字节码。
                • 搜索 ID [0x7f0700d1](检查您自己的 ID)
                • 找到图片并检查资源的所有用法(CMD + F7)
                • 修复

                希望它对某人有所帮助。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-09-17
                  • 2021-02-17
                  • 2011-06-06
                  • 2016-11-22
                  相关资源
                  最近更新 更多