API 18以下的旧手机出现了从可绘制资源引发的Android Resources$NotFoundException问题。

5

只有在使用Android 4.3和API 18的三星Galaxy Nexus手机进行测试时,我遇到了以下错误。

Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_error.xml
 from drawable resource ID #0x7f020098
    at android.content.res.Resources.loadDrawable(Resources.java:2091)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
    at android.widget.TextView.<init>(TextView.java:803)
    at android.widget.EditText.<init>(EditText.java:60)

在我的Acitivty.java文件中,我尝试使用以下方法来设置我的矢量Drawable:
editTextNickname.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_error, 0);
editTextNickname.setCompoundDrawables(null, null,
    ContextCompat.getDrawable(getApplicationContext(), R.drawable.ic_error), null);

我在我的build.gradle文件中使用了最新的支持库,如下所示:

apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.android.application'

android {
  compileSdkVersion 24
  buildToolsVersion "23.0.3"

defaultConfig {
  applicationId "com.peprally.jeremy.peprally"
  minSdkVersion 16
  targetSdkVersion 24
  versionCode 1
  versionName "1.0"
  vectorDrawables.useSupportLibrary = true
}
buildTypes {
  release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  }
  debug {
    debuggable true
  }
}

repositories {
  mavenCentral()
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.android.support:appcompat-v7:24.1.1'
  compile 'com.android.support:design:24.1.1'
  compile 'com.android.support:cardview-v7:24.1.1'
  compile 'com.android.support:support-v4:24.1.1'
  compile 'com.android.support:support-vector-drawable:24.1.1'
  compile 'com.facebook.android:facebook-android-sdk:4.6.0'
  compile 'com.google.android.gms:play-services-appindexing:9.2.1'
  compile 'com.google.firebase:firebase-core:9.2.1'
  compile 'com.google.firebase:firebase-messaging:9.2.1'
  compile 'com.amazonaws:aws-android-sdk-core:2.+'
  compile 'com.amazonaws:aws-android-sdk-cognito:2.+'
  compile 'com.amazonaws:aws-android-sdk-s3:2.+'
  compile 'com.amazonaws:aws-android-sdk-ddb:2.+'
  compile 'com.amazonaws:aws-android-sdk-ddb-mapper:2.+'
  compile 'com.squareup.picasso:picasso:2.5.2'
  compile 'com.android.volley:volley:1.0.0'
  compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha1'
  testCompile 'junit:junit:4.12'
}

apply plugin: 'com.google.gms.google-services'

我在StackOverflow上看到了类似的问题,但还没有好的解决方案。如果有人有任何见解,请帮忙!谢谢!

<--编辑-->

忽略这个问题一段时间后,我找到了一个很好的解决方法,可以避免VectorDrawable不受支持的问题。除了上面建议的内容外,您还可以使用以下代码创建VectorDrawables:

public static Drawable getAPICompatVectorDrawable(Context callingContext, int resource_id) {
  if (android.os.Build.VERSION.SDK_INT >= 21) {
    return ContextCompat.getDrawable(callingContext.getApplicationContext(), resource_id);
  } else {
    return VectorDrawableCompat.create(
        callingContext.getResources(),
        resource_id,
        callingContext.getTheme());
  }
}

我也遇到了在xml文件中直接使用矢量图标的问题。我找不到解决方法,最终只能将它们从我的xml文件中移除,并使用与上面相同的函数在java中以编程方式注入它们。如果有更好的解决方案,请告诉我!以下是在我的xml中使用矢量图标时出现的错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.
  peprally.jeremy.peprally/com.peprally.jeremy.peprally.activities.
  NewCommentActivity}:
android.view.InflateException: Binary XML file line #90: Error inflating class TextView
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: android.view.InflateException: Binary XML file line #90:
  Error inflating class TextView
3个回答

7

您能测试下面的代码吗?只是为了看看它是否有效,然后我会更新更多的信息。

public class MainActivity extends AppCompatActivity {
    static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

    @Override
    protected void onCreate(Bundle arg0) {
        ...
    }
    ...
}

背景

我知道由于这个谷歌问题-205236,由于内存问题,矢量图形支持被禁用。

该问题的评论之一是:

为了解决此问题,必须删除来自资源XML的VectorDrawable支持。

然后,

在下一个版本中,我添加了一个可选择的API,您可以重新启用已删除的VectorDrawable支持。

所以,他们在
Android Support Library 23.4.0中重新启用了该选项。

对于AppCompat用户,我们已经添加了一个可选择的API,以从资源中重新启用支持向量可绘制图像(在23.2中找到的行为),通过AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) - 请记住,这仍然可能会导致内存使用问题和更新配置实例的问题,因此默认情况下禁用它。

也许build.gradle设置现在已过时,您只需要在适当的活动中启用它(但需要测试)。


哦,太好了,它起作用了!请详细说明一下!非常感谢您的提示,我已经搜索了几天了,终于找到了解决方案! - jerbotron
但更重要的是,我遇到了更多与其他UI组件(如FloatingActionButtons)的兼容性问题。 - jerbotron
@jerbotron 已更新 :) - guipivoto
@cricket_007 我不确定,但我猜测 build.gradle 设置仅在第一次启用矢量图时使用。删除并重新启用后,我认为它现在已经过时了...但我需要测试。 - guipivoto
嘿@GuilhermeP,感谢您的解释!我仍然在使用静态矢量可绘制对象和充气布局文件方面遇到麻烦。我尝试在充气任何使用矢量可绘制对象的布局之前调用AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);但是我收到一个错误,说“错误膨胀类...”而没有其他信息。有什么建议吗? - jerbotron
显示剩余4条评论

0
关于AppCompatDelegate:“此功能默认禁用,因为启用它可能会导致内存使用问题和更新配置实例的问题。如果您手动更新配置,则可能不想启用此功能。您已被警告。

即使禁用了此功能,您仍然可以通过setImageResource(int)及其app:srcCompat属性使用矢量资源。它们也可以用于任何由AppCompat为您膨胀的内容,例如菜单资源。”source


0

这不是首选方案,但可行, 我从this网站混合使用矢量可绘制对象和PNG。


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