支持库VectorDrawable Resources $ NotFoundException

Ark*_*rka 67 android android-support-library androiddesignsupport android-vectordrawable

我使用的是Design Support Library版本23.4.0.我启用了gradle标志:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}
Run Code Online (Sandbox Code Playgroud)

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

它发生在我使用android:drawableLeft或时imageView.setImageResource(R.drawable.drawable_image).

是的,我把它放在我使用drawables的每个活动上

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
Run Code Online (Sandbox Code Playgroud)

这是支持库的错误吗?

Ric*_*ick 76

我需要使用支持库23.4.0才能使用3个单独的东西:

  1. 将其添加到build.gradle

    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将以下内容添加到Application类的onCreate中

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 对于要在其中设置矢量可绘制替换的所有xml视图

    android:src
    
    Run Code Online (Sandbox Code Playgroud)

    app:srcCompat
    
    Run Code Online (Sandbox Code Playgroud)

    并在代码中替换为:

    imageView.setImageResource(...);
    
    Run Code Online (Sandbox Code Playgroud)

    imageView.setImageDrawable(...);
    
    Run Code Online (Sandbox Code Playgroud)

  • 为什么用'seImageDrawable`替换`setImageResource`? (2认同)

Dav*_*and 56

为了补充这里的一些答案:对VectorDrawables的向后兼容支持需要付出代价,并不适用于所有情况.

它在哪些情况下有效?我已经使这个图表有所帮助(对支持库23.4.0有效至​​少25.1.0).

VectorDrawable cheatsheet


And*_*psa 30

尝试使用:

imageView.setImageDrawable(VectorDrawableCompat.create(getResources(), drawableRes, null));
Run Code Online (Sandbox Code Playgroud)

您不必以AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 这种方式添加.

只需使用VectorDrawableCompat对您的矢量绘图进行充气,就可以了.

  • 这有2个args而不是3:`AppCompatDrawableManager.get().getDrawable(context,resId);` (2认同)

Mur*_*rat 25

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

在此之前不要忘记添加:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}
Run Code Online (Sandbox Code Playgroud)

并为您使用矢量drawable的视图调用setImageResource.我的观点是ImageButton.我有Android SDK构建工具版本23.0.3

  • 我的问题是即使`AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);`也无效.相同的ResourceNotFound异常. (3认同)

zac*_*rav 14

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

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

public class MyApplicationClass extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

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

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)


emi*_*pmp 8

defaultConfig {
  vectorDrawables.useSupportLibrary = true
}
Run Code Online (Sandbox Code Playgroud)

在app.gradle中使用它

然后使用AppCompatDrawableManagersetDrawable和getDrawable.适合我


Mar*_*ski 7

android:drawableLeft在支持库23.3中禁用的地方支持矢量绘图.它在Google+上宣布:

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

问题链接:

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

如果您对这是如何工作感到好奇,最好的学习者是Chris Banes,他撰写了这个功能.他在博客上详细解释.


jma*_*tar 5

改变

imageView.setImageResource(R.drawable.drawable_image)
Run Code Online (Sandbox Code Playgroud)

imageView.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.drawable_image));
Run Code Online (Sandbox Code Playgroud)

如果要在 xml 中使用 vectordrawable,请使用:

app:srcCompat="@drawable/drawable_image"
Run Code Online (Sandbox Code Playgroud)

  • 您的方法 setImageDrawable 有效。但仍然按钮 drawableLeft 不起作用。 (2认同)