【问题标题】:Resources$NotFoundException when using vector images on API22 but not on API24在 API 22 上但不在 API 24 上使用矢量图像时的 Resources$NotFoundException
【发布时间】:2018-06-10 05:00:25
【问题描述】:

我遇到了在 Android 中使用 vector 的问题。

我正在使用矢量(来自 android studio 中导入的 SVG)将图像显示为我的 Textview 的背景,使用 android:background="@drawable/ic_blue2"

虽然在使用 API24 的手机上进行测试时一切正常,但应用程序在使用 API22 的手机上启动时会崩溃并出现 InflateException 和 Resources$NotFoundException。

我尝试了以前帖子的答案,例如添加到 Gradle vectorDrawables.useSupportLibrary = true,但没有奏效。

我使用的是 Android Studio 3.0.1 和 Gradle 3.0.1。请注意,我的活动扩展了“活动”而不是 AppCompatActivity(不知道这是否重要)。

这是布局的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBackgroundWhite"
    tools:context="jdev.com.handtwist.MainMenu">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="vertical"
        android:padding="20dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/ic_gray7"
            android:orientation="vertical">

            <TextView
                android:id="@+id/textViewAppname"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/ic_blue7"
                android:padding="10dp"
                android:text="test"
                android:textAlignment="center"
                android:textColor="@color/colorBackgroundWhite"
                android:textSize="36sp"
                android:textStyle="bold" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:paddingBottom="30dp"
                android:paddingLeft="50dp"
                android:paddingRight="50dp"
                android:paddingTop="20dp"
                tools:layout_editor_absoluteY="100dp">

                <Button
                    android:id="@+id/buttonSolo"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@drawable/ic_blue2"
                    android:padding="10dp"
                    android:text="@string/solo"
                    android:textAlignment="center"
                    android:textColor="@color/colorBackgroundWhite"
                    android:textSize="24sp" />

                <Button
                    android:id="@+id/buttonMulti"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="10dp"
                    android:background="@drawable/ic_blue2"
                    android:padding="10dp"
                    android:text="@string/multi"
                    android:textAlignment="center"
                    android:textColor="@color/colorBackgroundWhite"
                    android:textSize="24sp" />

            </LinearLayout>
        </LinearLayout>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="bottom"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textViewVersion"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Version"
            android:textAlignment="center"
            android:textColor="@color/colorBackgroundWhite" />
    </LinearLayout>

</android.support.constraint.ConstraintLayout>

我尝试用作背景的xml示例(文件太大)https://pastebin.com/DRR5eRm0

以及 API22 上的错误

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: jdev.com.handtwist, PID: 4666
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{jdev.com.handtwist/jdev.com.handtwist.MainMenu}: android.view.InflateException: Binary XML file line #0: Error inflating class <unknown>
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3160)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275)
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:145)
                      at android.app.ActivityThread.main(ActivityThread.java:7007)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
                   Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class <unknown>
                      at android.view.LayoutInflater.createView(LayoutInflater.java:640)
                      at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55)
                      at android.view.LayoutInflater.onCreateView(LayoutInflater.java:689)
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:813)
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:821)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:511)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:415)
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:366)
                      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:450)
                      at android.app.Activity.setContentView(Activity.java:2400)
                      at jdev.com.handtwist.MainMenu.onCreate(MainMenu.java:40)
                      at android.app.Activity.performCreate(Activity.java:6609)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:7007) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                   Caused by: java.lang.reflect.InvocationTargetException
                      at java.lang.reflect.Constructor.newInstance(Native Method)
                      at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
                      at android.view.LayoutInflater.createView(LayoutInflater.java:614)
                      at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
                      at android.view.LayoutInflater.onCreateView(LayoutInflater.java:689) 
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:813) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:821) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:511) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
                      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:450) 
                      at android.app.Activity.setContentView(Activity.java:2400) 
                      at jdev.com.handtwist.MainMenu.onCreate(MainMenu.java:40) 
                      at android.app.Activity.performCreate(Activity.java:6609) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:7007) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                   Caused by: android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v21/ic_gray7.xml from drawable resource ID #0x7f0603a5
                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:4061)
                      at android.content.res.Resources.loadDrawable(Resources.java:3929)
                      at android.content.res.Resources.loadDrawable(Resources.java:3779)
                      at android.content.res.TypedArray.getDrawable(TypedArray.java:776)
                      at android.view.View.<init>(View.java:4001)
                      at android.view.ViewGroup.<init>(ViewGroup.java:513)
                      at android.widget.LinearLayout.<init>(LinearLayout.java:199)
                      at android.widget.LinearLayout.<init>(LinearLayout.java:195)
                      at android.widget.LinearLayout.<init>(LinearLayout.java:191)
                      at java.lang.reflect.Constructor.newInstance(Native Method) 
                      at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
                      at android.view.LayoutInflater.createView(LayoutInflater.java:614) 
                      at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:55) 
                      at android.view.LayoutInflater.onCreateView(LayoutInflater.java:689) 
                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:813) 
                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:821) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:511) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:415) 
                      at android.view.LayoutInflater.inflate(LayoutInflater.java:366) 
                      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:450) 
                      at android.app.Activity.setContentView(Activity.java:2400) 
                      at jdev.com.handtwist.MainMenu.onCreate(MainMenu.java:40) 
                      at android.app.Activity.performCreate(Activity.java:6609) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:7007) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                   Caused by: android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v22/$ic_gray7__0.xml from color state list resource ID #0x7f060118
                      at android.content.res.Resources.twLoadColorStateList(Resources.java:4179)
                      at android.content.res.Resources.loadColorStateList(Resources.java:4117)
                      at android.content.res.TypedArray.getColor(TypedArray.java:397)
                      at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1439)
                      at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1418)
                      at android.graphics.drawable.VectorDrawable.inflateInternal(VectorDrawable.java:544)
                      at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:460)
                      at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1192)
                      at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1086)
                    at android.content.res.Resources.loadDraw

感谢任何可以帮助我的人。

编辑:尝试使用本的方法时出错:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: jdev.com.handtwist, PID: 16157
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{jdev.com.handtwist/jdev.com.handtwist.MainMenu}: android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v21/ic_testb.xml from drawable resource ID #0x7f0603ce
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3160)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275)
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:145)
                      at android.app.ActivityThread.main(ActivityThread.java:7007)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
                   Caused by: android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v21/ic_testb.xml from drawable resource ID #0x7f0603ce
                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:4061)
                      at android.content.res.Resources.loadDrawable(Resources.java:3929)
                      at android.content.res.Resources.getDrawable(Resources.java:1991)
                      at android.content.res.Resources.getDrawable(Resources.java:1973)
                      at android.content.Context.getDrawable(Context.java:409)
                      at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:351)
                      at jdev.com.handtwist.MainMenu.onCreate(MainMenu.java:63)
                      at android.app.Activity.performCreate(Activity.java:6609)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:7007) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                   Caused by: android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v22/$ic_testb__0.xml from color state list resource ID #0x7f060295
                      at android.content.res.Resources.twLoadColorStateList(Resources.java:4179)
                      at android.content.res.Resources.loadColorStateList(Resources.java:4117)
                      at android.content.res.TypedArray.getColor(TypedArray.java:397)
                      at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1439)
                      at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1418)
                      at android.graphics.drawable.VectorDrawable.inflateInternal(VectorDrawable.java:544)
                      at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:460)
                      at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1192)
                      at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1086)
                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:4045)
                      at android.content.res.Resources.loadDrawable(Resources.java:3929) 
                      at android.content.res.Resources.getDrawable(Resources.java:1991) 
                      at android.content.res.Resources.getDrawable(Resources.java:1973) 
                      at android.content.Context.getDrawable(Context.java:409) 
                      at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:351) 
                      at jdev.com.handtwist.MainMenu.onCreate(MainMenu.java:63) 
                      at android.app.Activity.performCreate(Activity.java:6609) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:7007) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 
                   Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #0: invalid drawable tag gradient
                      at android.content.res.ColorStateList.twCreateFromXmlInner(ColorStateList.java:176)
                      at android.content.res.ColorStateList.twCreateFromXml(ColorStateList.java:147)
                      at android.content.res.Resources.twLoadColorStateList(Resources.java:4175)
                      at android.content.res.Resources.loadColorStateList(Resources.java:4117) 
                      at android.content.res.TypedArray.getColor(TypedArray.java:397) 
                      at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1439) 
                      at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1418) 
                      at android.graphics.drawable.VectorDrawable.inflateInternal(VectorDrawable.java:544) 
                      at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:460) 
                      at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1192) 
                      at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1086) 
                      at android.content.res.Resources.loadDrawableForCookie(Resources.java:4045) 
                      at android.content.res.Resources.loadDrawable(Resources.java:3929) 
                      at android.content.res.Resources.getDrawable(Resources.java:1991) 
                      at android.content.res.Resources.getDrawable(Resources.java:1973) 
                      at android.content.Context.getDrawable(Context.java:409) 
                      at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:351) 
                      at jdev.com.handtwist.MainMenu.onCreate(MainMenu.java:63) 
                      at android.app.Activity.performCreate(Activity.java:6609) 
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) 
                      at android.app.ActivityThread.access$1000(ActivityThread.java:218) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:145) 
                      at android.app.ActivityThread.main(ActivityThread.java:7007) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 

【问题讨论】:

  • 看起来在加载 res/drawable-anydpi-v21/ic_gray7.xml 时遇到了一些问题。您是否有 v22 以上的 API 版本(如 v23)?你能添加这个drawable的内容吗?
  • 我无法(暂时)在其他 API 上进行测试。我在帖子中添加了我尝试使用的 xml 文件的内容。

标签: java android svg vector


【解决方案1】:

对于较旧的 API 级别不存在对 XML 中矢量可绘制对象的原生支持。由于app:srcCompat 的特殊属性,您可以在ImageViews 中使用它们,但不能将它们用于android:background 等。

但是,您可以在 Java 中使用它们。类似的东西

Button b = findViewById(R.id.buttonSolo);
Drawable d = ContextCompat.getDrawable(this, R.drawable.ic_blue2);
b.setBackground(d);

应该适用于所有 API 级别。

【讨论】:

  • 感谢您的回答。我试过你的代码,但它不起作用。我想我将不得不处理这个问题,要么忘记向量,要么只支持 API>=24,因为它适用于 android:background
  • 我在第一篇文章中添加了错误日志。同类型的问题。但是我不明白为什么应用程序尝试在 res/drawable-anydpi-v21 中找到 xml,然后在 xml 在 res/drawable 中时找到 res/drawable-anydpi-v22。我尝试将 xml 放在那些文件夹中,但它没有改变任何东西。
【解决方案2】:

从 pastebin 中的(更新的)链接到您的资产,看起来您正在使用新的 XML 包格式。注意&lt;aapt:attr name="android:fillColor"&gt; 节点。参见this G+ postNick Butcher。即使是关于动画矢量绘图,它也适用于您的情况,因为我确信机制是相同的。

要检查的重要一点是:

这需要 Build Tools 24+(目前在 RC 中),但输出向后兼容。

因此,应该检查您的构建工具是否已更新。

【讨论】:

  • 我的错!我确实将 svg 而不是 xml 上传到 pastebin,我更新了我的帖子 pastebin.com/DRR5eRm0 真的很抱歉。
  • 我用的是27.0.1,所以是最新版本
  • 那么它可能是一个错误。我在 Google 问题跟踪器中找到了这个 issuetracker.google.com/issues/70940261,这可能是相关的。与此同时,我认为下一步应该是使用 Shift-Cmd-A -> 从 Android Studio 分析 APK... 打开生成的 APK 并尝试找到您的可绘制对象,并将其添加到您的问题中。
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
相关资源
最近更新 更多