如果我在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时它可以正常运行。
答案 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:srcCompat
和setImageResource()
继续有效。
如果您想使用 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