Android vectorDrawables.useSupportLibrary = true正在停止应用

时间:2016-12-31 11:15:40

标签: android android-support-library android-appcompat android-vectordrawable

如果我在gradle中使用 vectorDrawables.useSupportLibrary = true ,则不幸地运行它停止的应用程序。如果我删除 vectorDrawables.useSupportLibrary = true ,该应用就可以运行。

我的傻瓜:

SyntaxError: unterminated string literal
CKEDITOR.instances.messageArea.setData("<p>Example text</p>

错误:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
        applicationId "com.helikanon.firstapp"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.0'
    compile 'com.android.support:design:25.1.0'
    compile 'com.jakewharton:butterknife:8.4.0'
    compile 'com.android.support:support-v4:25.1.0'
    testCompile 'junit:junit:4.12'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
    compile 'uk.co.chrisjenx:calligraphy:2.2.0'
    compile 'com.google.android.gms:play-services-ads:10.0.1'
}

当我使用Api 16和Api 19时应用程序崩溃但是当我使用Api 23时它可以正常运行。

5 个答案:

答案 0 :(得分:29)

您不能在pre-lollipop中除ImageView之外的任何其他视图中使用 Vector Drawables

请参阅谷歌开发者倡导者SO Answer

  

对于AppCompat用户,由于版本23.2.0 / 23.2.1 [https://code.google.com/p/android/issues/detail?id=205236中的实现中发现的问题,我们决定删除允许您使用Lollipop前设备上的资源使用矢量绘图的功能。 ,https://code.google.com/p/android/issues/detail?id=204708]。使用app:srcCompatsetImageResource()继续有效。

如果您想使用 Vector Drawables pre-lollipop,请使用可以通过将其转换为drawable来以编程方式设置它。

Drawable drawable;

if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
     drawable = context.getResources().getDrawable(drawableResId, context.getTheme());
} else {
     drawable = VectorDrawableCompat.create(context.getResources(), drawableResId, context.getTheme());
}

button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);

答案 1 :(得分:4)

如果您的minSdkVersion 21或更高版本,则不需要此。

Android 5.0正式支持矢量可绘制对象。

https://developer.android.com/guide/topics/graphics/vector-drawable-resources

更新:如StuStirling所述,在API24(Android 7.0)以下,如果您在矢量文件中引用其他资源,则需要此功能。

更新

如果您删除了vectorDrawables.useSupportLibrary = true,则从矢量中分析APK以生成png。如果在可绘制对象中找到ex:xxxhdpi-v4,则放回useSupportLibrary行。 (我没有从向量中引用其他可绘制对象)

答案 2 :(得分:3)

我在一个实践项目中尝试学习Android中的后台任务和服务。当我提取他们的示例代码时,最初由于this错误而没有进行编译。因此,我在应用的build.gradle文件中添加了以下标记,以消除编译问题:

android {
    defaultConfig{
        vectorDrawables.useSupportLibrary = true
    }
}

现在,我添加此配置的那一刻,我的应用程序也开始完全按照OP的描述在Microsoft Android Simulator中崩溃。

由于我当前的重点是学习后台任务,因此我想开始调试我的应用程序。因此,我再次删除了上面的配置设置。除此之外,我还在我的一个可绘制资源的android:fillColor标记中删除了一个名为path的属性(或者您也可以将@color/colorAccent的值替换为十六进制代码,例如{{1 }})。删除(或使用十六进制代码进行更改)之后,我的初始编译错误没有出现:

#FF000000

删除后,它看起来像:

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="80dp"
    android:height="80dp"
    android:viewportWidth="24"
    android:viewportHeight="24">

    <path
        android:fillColor="@color/colorAccent"
        android:pathData="M16.01 7L16 3h-2v4h-4V3H8v4h-0.01C7 6.99 6 7.99 6 8.99v5.49L9.5
18v3h5v-3l3.5-3.51v-5.5c0-1-1-2-1.99-1.99z" />
    <path
        android:pathData="M0 0h24v24H0z" />
</vector>

我的MS Android模拟器具有Kitkat(4.4)。正如我在Vipul接受的答案中提到的那样,我的应用程序试图在棒棒糖之前的Android版本上使用矢量可绘制对象,因此代码崩溃了。

答案 3 :(得分:2)

要使用VectorDrawableCompat,您需要设置 android.defaultConfig.vectorDrawables.useSupportLibrary = true。

要使用VectorDrawableCompat,您需要对项目进行两次修改。首先,在build.gradle文件中设置android.defaultConfig.vectorDrawables.useSupportLibrary = true,其次,使用app:srcCompat而不是android:src来引用矢量可绘制对象。

1)转到您的build.gradle(Module:app)并将以下行添加到android块。看起来应该是这样。

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "..."
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
------> android.defaultConfig.vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

2)将源称为 srcCompat ,以允许您的应用程序使用矢量图形。

app:srcCompat =“ @ drawable / plane”

答案 4 :(得分:0)

您的问题是 Button 不是 ImageView 的子类。

ImageView 或其子类,例如 ImageButton FloatingActionButton 可以使用新的app:srcCompat属性引用矢量可绘制对象。

要支持矢量可绘制和动画矢量可绘制,您需要添加:

android {
    defaultConfig {
         vectorDrawables.useSupportLibrary = true
    }

并使用app:srcCompat

<ImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  app:srcCompat="@drawable/ic_add" />

通过使用AndroidX提供的此方法将Vector Drawable以编程方式转换为可绘制对象,您仍然可以使用它:

val drawable = AppCompatResources.getDrawable(context, R.drawable.loading_indeterminate)

https://developer.android.com/guide/topics/graphics/vector-drawable-resources

https://medium.com/androiddevelopers/using-vector-assets-in-android-apps-4318fd662eb9