支持库VectorDrawable资源$NotFoundException

74

我正在使用Design Support Library版本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);
}

这是支持库的一个漏洞吗?


3
你好,我和你一样遇到了同样的问题。你有解决 Android:drawableLeft 的方法吗? - Sayem
1
@Sayem 不行。我必须完全从按钮中删除图形。但是你可以提供单独的PNG作为可绘制对象。 - Arka
是的,我已经按照您的建议完成了它。 - Sayem
14个回答

89

为了让我成功使用支持库23.4.0,需要做3件事情:

  1. 将以下内容添加到build.gradle

  2. defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
    请将以下内容添加到您的Application类的onCreate 中:
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    

    (从此链接的参考资料 - "https://stackoverflow.com/a/45582033/10752962")

    在 API 版本小于 21 的情况下,在 setContentView() 之前使用以下行;

  3. 对于所有设置矢量图形的 XML 视图,请进行替换。

  4. android:src
    

    随着

    app:srcCompat
    

    并且在代码中替换为:

    imageView.setImageResource(...);
    

    随着

    imageView.setImageDrawable(...);
    

我已经完成了步骤1至3(在第3步中使用了app:srcCompat)。但是,我仍然看到一个异常XmlPullParserException:Binary XML file line#4:invalid drawable tag vector。看起来XML中的vector标记在这个KitKat设备上无法识别? - Someone Somewhere
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 这是我的救星代码。我必须在我的应用程序中添加它。 - shadowsheep
2
为什么要用setImageDrawable替换setImageResource - Boy
1
如果您使用 imageView.setImageResource(...),则不需要 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)。已经在25.3.1支持库中进行了测试。 - Eric B.
有了新的androidX库,我只需要使用“app:srcCompat”来修复崩溃。其他所有东西都保持不变。只使用了XML。参考资源是:“@drawable/ic_done_white”,只在4.4中崩溃。谢谢。 - CaptainCrunch
显示剩余2条评论

65

补充一些答案: 支持VectorDrawables的向后兼容性是有代价的,并且并不适用于所有情况。

在哪些情况下它有效? 我制作了这个图表来帮助您(适用于Support Library 23.4.0到至少25.1.0)。

VectorDrawable cheatsheet


1
它在KitKat(4.4.4)(以及更低版本,我猜)中无法使用setImageResource,只有这个可以使用https://dev59.com/DFsV5IYBdhLWcg3wrQkp#35918375 - user924

32

尝试使用:

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

你不需要这样添加 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
只需使用 VectorDrawableCompat 来填充你的矢量图形,就可以了。

3
这里只有两个参数,而非三个:AppCompatDrawableManager.get().getDrawable(context, resId); - Jared Burrows

25

我们遇到了同样的问题。矢量图在Kitkat上无法显示。我通过在Activities的onCreate方法中添加 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 来解决这个问题。

在此之前不要忘记添加:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

并针对您使用的矢量图形绘制视图调用setImageResource。我的视图是ImageButton。我使用的Android SDK构建工具版本为23.0.3。


3
我的问题是即使使用了AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);,它仍然无法正常工作。出现了相同的ResourceNotFound异常。 - Arka
@Arka 你可以尝试在Activities的onCreate方法中调用。 - Murat
1
你应该能够将它添加到你的应用程序类的onCreate方法中。这对我来说似乎是有效的。 - Rich Luick

16

对于迟到的事表示抱歉,但此答案可能会帮助想要为所有活动启用标志 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();
    }
}

9
defaultConfig {
  vectorDrawables.useSupportLibrary = true
}

在 app.gradle 中使用此代码

然后使用 AppCompatDrawableManager 设置 drawable 和获取 drawable。这对我很有效。


7

支持在像android:drawableLeft这样的地方使用矢量图在支持库23.3中被禁用。在Google+上宣布:

由于在版本23.2.0 / 23.2.1中发现的实现问题,我们决定删除让你在早期的Lollipop设备上从资源中使用矢量图的功能。使用app:srcCompat和setImageResource()仍然可以工作。

问题链接:

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

如果您想了解其工作原理,最好向编写此功能的Chris Banes学习。他在他的博客中详细解释。


5

更改

imageView.setImageResource(R.drawable.drawable_image)

to

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

如果您想在XML中使用矢量图形,则可以使用以下方法:

app:srcCompat="@drawable/drawable_image"

2
你的 setImageDrawable 方法可行。但是按钮的 drawableLeft 仍然无法工作。 - Arka
这会导致旧设备崩溃。 - Clive Jefferies
这个不起作用。请使用这里的其他答案之一。 - Sakiboy
你需要在build.gradle文件中添加vectorDrawables.useSupportLibrary = true,并在Application类的onCreate方法中添加AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);或者在activity中添加{AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);}。请查看问题。他在提问之前已经在代码中添加了这些行。 - jmarkstar

1

我很久以前也遇到过类似的问题,但是设置

vectorDrawables.useSupportLibrary = true

并没有起作用,只有当我创建了“mipmap”文件夹,并且代码使用

imageView.setImageResource (R.mipmap.drawable_image)

时才有效。更多信息请参见此处


1
不要把你的向量图放在drawable-anydpi文件夹里,老设备不支持此功能。请将它们放在drawable文件夹中。

这对我有效。 - Umair Iqbal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接