支持库VectorDrawable Resources $ NotFoundException


71

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

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

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

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

是的,我在使用可绘制对象的每个活动中都使用了此功能

static {
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

这是支持库的错误吗?


3
面临与您相同的问题。您是否对android:drawableLeft有任何解决方案?
Sayem

1
@Sayem号。我不得不从按钮上完全删除图形。虽然您可以提供单独的png作为可绘制对象。
阿卡

是的..我已经按照您的建议做了。
Sayem '16

Answers:


86

我花了3件单独的事才能使用支持库23.4.0使其正常工作:

  1. 将此添加到 build.gradle

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

    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    

    (通过此链接的引用-“ https://stackoverflow.com/a/45582033/10752962 ”)

    少于21的API中,在此之前使用此行setContentView()

  3. 对于要在其中设置矢量可绘制对象的所有XML视图

    android:src
    

    app:srcCompat
    

    并在代码中替换为:

    imageView.setImageResource(...);
    

    imageView.setImageDrawable(...);
    

即使我的活动基于AppCompatActivity,这也适用吗?AppCompatActivity已使用AppCompatDelegate。
Thupten

只需使用AppCompatImageView代替即可ImageView。问题解决了。无需保留较低版本的PNG。甚至srcCompat不需要。
Harish Gyanani '16

我已经完成了步骤1至3(在使用的第3步中app:srcCompat)。但是,我仍然看到一个异常XmlPullParserException: Binary XML file line #4: invalid drawable tag vector。看起来vector在此KitKat设备上无法识别XML中的标签?
某处某人

2
为什么要替换setImageResourceseImageDrawable
男孩

1
如果使用,imageView.setImageResource(...)AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)不需要。经过25.3.1支持库测试。
Eric B.

62

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

在什么情况下有效?我制作了此图来提供帮助(对支持库23.4.0到至少25.1.0有效)。

VectorDrawable备忘单


1
它不适setImageResource用于KitKat(4.4.4)(我想应该是更低的),只有这才有效stackoverflow.com/a/35918375/7767664
user924

32

尝试使用:

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

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

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


3
它具有2个参数,而不是3个参数:AppCompatDrawableManager.get().getDrawable(context, resId);
Jared Burrows

25

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

在此之前,请不要忘记添加:

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

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


3
我的问题是,甚至AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);无法正常工作。相同的ResourceNotFound异常。
阿卡(Arka)2013年

@Arka您可以尝试调用Activity的onCreate方法。
穆拉特

1
您应该可以将其添加到应用程序类的onCreate中。那似乎对我有用。
Rich Luick

15

抱歉,聚会晚了,但是此答案可能对希望启用标志AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)的用户有所帮助所有活动。

1.创建一个扩展到应用程序的类(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中使用它

然后使用AppCompatDrawableManagersetDrawable和getDrawable。为我工作


7

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

由于版本23.2.0 / 23.2.1的实现中存在问题,我们决定删除允许您在棒棒糖之前的设备上使用矢量可绘制对象的功能。使用app:srcCompat和setImageResource()继续工作。

问题链接:

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

如果您想知道这是如何工作的,最好的人就是克里斯·班内斯(Chris Banes),他是该功能的作者。他在博客上详细解释


5

更改

imageView.setImageResource(R.drawable.drawable_image)

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

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

app:srcCompat="@drawable/drawable_image"

2
您的方法setImageDrawable有效。但是按钮drawableLeft仍然无法正常工作。
阿卡(Arka)2013年

这会导致旧设备崩溃。
Clive Jefferies

这行不通。请在此处使用其他答案之一。
Sakiboy'5

您应该在build.gradle上具有此vectorDrawables.useSupportLibrary = true,并且此AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 在您的应用程序类的onCreate上或{AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); }您的活动。检查问题。在询问之前,他在代码中添加了这些行
jmarkstar'5

1

我很久以前也遇到过类似的问题,但设置后无法正常工作

vectorDrawables.useSupportLibrary = true

仅当我创建“ mipmap”文件夹时使用,并且使用的代码

imageView.setImageResource (R.mipmap.drawable_image)

在这里有更多信息


1

API 16动画
膨胀Drawable的

`VectorDrawable``AnimatedVectorDrawable`在此支持库可以以这种方式被夸大:

  • 调用静态getDrawable()方法:
//这只会为以<vector>为根元素的drawable膨胀
VectorDrawable.getDrawable(context,R.drawable.ic_arrow_vector);

//这只会为以<animated-vector>为根元素的可绘制对象膨胀
AnimatedVectorDrawable.getDrawable(context,R.drawable.ic_arrow_to_menu_animated_vector);

//这将使所有drawable膨胀,并自动回退到api 21+设备上的lollipop实现
ResourcesCompat.getDrawable(上下文,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);
    

    看看github上自述vector-compat位置: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'
    }
    

    1

    请勿将向量放入drawable-anydpi ,旧设备不支持

    把它们放进去 drawable


    这对我有用。
    Umair Iqbal,

    1

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

    <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来避免矢量兼容库的任何麻烦。



    0

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

    我发现问题部分的方式:

    我的错误看起来像:

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

    这是我遵循提到的drawable的资源ID的步骤:

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

    希望它能帮助到别人。

    By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
    Licensed under cc by-sa 3.0 with attribution required.