支持库 VectorDrawable Resources $NotFoundException

我正在使用设计支持库版本 23.4.0。我已经启用了等级标志:

defaultConfig {
vectorDrawables.useSupportLibrary = true
}

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

当我使用 android:drawableLeft或者 imageView.setImageResource(R.drawable.drawable_image)的时候就会发生。

是的,我把这个放在每一个我使用绘图工具的活动中

static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

这是支持库的 bug 吗?

38942 次浏览

改变

imageView.setImageResource(R.drawable.drawable_image)

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

如果希望在 xml 中使用 vectordrawable,请使用以下命令:

app:srcCompat="@drawable/drawable_image"

我很久以前也遇到过类似的问题,它不能通过设置来工作

vectorDrawables.useSupportLibrary = true

只有当我创建“ mipmap”文件夹时才能工作,而且所使用的代码

imageView.setImageResource (R.mipmap.drawable_image)

它有更多的信息 给你

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

在此之前,不要忘记加上:

defaultConfig {
vectorDrawables.useSupportLibrary = true
}

并调用 setImageResource 获取您使用向量绘制的视图。我的视图是 ImageButton。我有 Android SDK 构建工具版本23.0.3

在支持库23.3中,像 android:drawableLeft这样的地方对矢量绘图的支持被禁用了:

我们决定去掉允许你使用矢量的功能 由于发现问题,可从前棒棒糖设备的资源中提取 使用 app: srcCompat 和 setImageResource () 继续工作。

问题链接:

但是,如果您能够解决这些问题,那么在23.4版本中,您可以使用 SetCompatVectorFromResourcesEnable ()重新启用这个功能。

如果你好奇它是如何工作的,最好的学习对象是 Chris Bane,他编写了这个功能。他详细解释了 在他的博客上

我使用 支持库23.4.0做了三件不同的事:

  1. 把这个加到 build.gradle

    defaultConfig {
    vectorDrawables.useSupportLibrary = true
    }
    
  2. Add the following to onCreate of your Application class

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    

    (参考此连结-「 https://stackoverflow.com/a/45582033/10752962」)

    空气污染指数少于21中,在 setContentView()之前使用此行;

  3. 对于正在设置向量绘制替换的所有 XML 视图

    android:src
    

    app:srcCompat
    

    并在代码中替换以下内容:

    imageView.setImageResource(...);
    

    imageView.setImageDrawable(...);
    

尝试使用:

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

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

只需要使用 VectorDrawableCompat 充气您的矢量绘图,就可以了。

API 16 animation
充气式可拉伸工件

这个支持库中的 `VectorDrawable``AnimatedVectorDrawable`可以这样充气:

  • 调用静态 getDrawable()方法:
//This will only inflate a drawable with <vector> as the root element
VectorDrawable.getDrawable(context, R.drawable.ic_arrow_vector);


//This will only inflate a drawable with <animated-vector> as the root element
AnimatedVectorDrawable.getDrawable(context, R.drawable.ic_arrow_to_menu_animated_vector);


// This will inflate any drawable and will auto-fallback to the lollipop implementation on api 21+ devices
ResourcesCompat.getDrawable(context, R.drawable.any_drawable);

如果在 Java 代码中使用 Drawable 充气,建议始终使用 ResourcesCompat.getDrawable(),因为这可以在适用时处理 Lollipop 回退。这允许系统缓存可绘制的 ConstantState,因此效率更高。
该库具有以下变体(双向)动画:

  • 暂停变形动画
  • 播放-停止变形动画
  • 箭头-汉堡菜单变形动画

  • 正如你所看到的,我在我的 API 16手机上生成了上面的图像:

    import com.wnafee.vector.compat.AnimatedVectorDrawable;
    mdrawable = (AnimatedVectorDrawable) AnimatedVectorDrawable.getDrawable(this.getApplicationContext(), R.drawable.consolidated_animated_vector);
    

    看看这里 vector-compat的 github 自述: https://github.com/wnafee/vector-compat
    这将修复您的问题(下降到 API 14) ,如果您合并它与您的应用程序模块的 build.gradle dependencies(通常在文件结尾) :

    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'
    }
    
    defaultConfig {
    vectorDrawables.useSupportLibrary = true
    }
    

    在 app.gradle 中使用这个

    然后使用 AppCompatDrawableManager设置可绘制和 getDrawable

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

    在哪些情况下它可以工作? 我使用 这张图来提供帮助(对于 Support Library 23.4.0至少有效到25.1.0)。

    VectorDrawable cheatsheet

    不要把你的矢量在 drawable-anydpi 旧设备不支持

    放进 drawable

    很抱歉来晚了,但是这个答案可以帮助那些希望为所有活动启用 SetCompatVectorFromResourcesEnable (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();
    }
    }
    

    使用 AppCompatImageView代替 ImageView,就像 Harish Gyanani 在评论中说的那样,它对我来说很好用。

    官方文件

    在我的特殊情况下,我有这个问题,因为我使用一个可绘制的选择器作为图像资源,在选择器中有几个向量,如:

    <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 来避免任何关于向量 compat 库的麻烦。

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

    我发现问题的方式是:

    我的错误是这样的:

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

    下面是我按照上面提到的绘图工具的资源 ID 所采取的步骤:

    • APK Analyzer-> classesXXX.dex
    • 在这个 dex 文件中,我打开了我的 apps 软件包名称的目录,转到了 R $draable file
    • R $draable-> Show as byte code.
    • 搜寻 ID [0x7f0700d1](检查你自己的 ID)
    • 查找图像并检查资源的所有用法(CMD + F7)
    • 修好

    希望能帮到别人。