安卓矢量支持错误

3

我的应用在5.1.0版本中运行顺畅,但在4.2.2版本中运行时出现错误:

Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #1: invalid drawable tag vector 

我已经研究过这个问题。它表明在gradle中添加向量支持时出现错误,所以我添加了以下内容:
compileSdkVersion 23
buildToolsVersion "25.0.1"
 defaultConfig {
    applicationId "com.wmt.android.troopool"
    minSdkVersion 15
    targetSdkVersion 23
    versionCode 1
    versionName "0.1"
    multiDexEnabled true
    renderscriptTargetApi 18
    renderscriptSupportModeEnabled true
    vectorDrawables.useSupportLibrary = true
}

compile 'com.android.support:support-vector-drawable:23.2.0'
compile 'com.android.support:animated-vector-drawable:23.2.0'

vectorDrawables.useSupportLibrary = true 和 gradle 文件中的两个依赖项。

但在 4.4.2 版本中仍然显示相同的错误。


你尝试将依赖项更改为compile 'com.android.support:appcompat-v7:24.2.1'了吗? - siddhesh
你必须在你的ImageView上使用app:srcCompat - Daniel Zolnai
它在图像视图中可以工作。但是我如何将其添加到文本视图作为可绘制的左侧? - Vishal Jadav
对于矢量图像资源作为可绘制的左侧,您可以在按钮和TextView中使用VectorDrawable吗?请参考https://dev59.com/Gek6XIcBkEYKwwoYC_n6#40250753 - Vishal Jadav
1个回答

0

嘿,在Lollipop以下的Android上使用矢量可绘制对象,您需要从代码中放置图像。以下是一些函数,应该可以帮助您实现所需的功能。

public static enum DrawablePosition {
    Left, Right, Top, Bottom
}

public static Drawable getDrawable(Context context, int drawable) {
    return DrawableCompat.wrap(VectorDrawableCompat.create(context.getResources(), drawable, null));
}

public static Drawable getDrawableWithColor(Context context, int drawableResId, int IntColorOfDrawable) {
    Drawable drawable = VectorDrawableCompat.create(context.getResources(), drawableResId, null);
    DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(drawable, IntColorOfDrawable);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
    return drawable;
}

public static void setDrawableWithColorForIds(AppCompatActivity activity, int color, int[] ids, int drawable[]) {
    for (int i = 0; i != ids.length; i++) {
        Drawable drawable1 = VectorDrawableCompat.create(activity.getResources(), drawable[i], null);
        DrawableCompat.wrap(drawable1);
        DrawableCompat.setTint(drawable1, color);
        DrawableCompat.setTintMode(drawable1, PorterDuff.Mode.SRC_IN);
        ((TextView) activity.findViewById(ids[i])).setCompoundDrawablesWithIntrinsicBounds(drawable1, null, null, null);
    }
}

public static void placeVectorOnTextView(Context context, TextView textView, int vectorDrawableResID, @Nullable Integer VectorColor, DrawablePosition position) {
    Drawable drawable = VectorDrawableCompat.create(context.getResources(), vectorDrawableResID, null);
    DrawableCompat.wrap(drawable);
    if (VectorColor != null){
        DrawableCompat.setTint(drawable, VectorColor);
        DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
    }
    switch (position) {
        case Left:
            textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
            break;
        case Bottom:
            textView.setCompoundDrawablesWithIntrinsicBounds(null, null, null, drawable);
            break;
        case Right:
            textView.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
            break;
        case Top:
            textView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
            break;

    }

}

public static void placeVectorOnEditText(Context context, EditText editText, int vectorDrawableResID, int VectorColor, DrawablePosition position) {
    Drawable drawable = VectorDrawableCompat.create(context.getResources(), vectorDrawableResID, null);
    DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(drawable, VectorColor);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
    switch (position) {
        case Left:
            editText.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
            break;
        case Bottom:
            editText.setCompoundDrawablesWithIntrinsicBounds(null, null, null, drawable);
            break;
        case Right:
            editText.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
            break;
        case Top:
            editText.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
            break;

    }

}

public static void placeVectorOnButton(Context context, Button button, int vectorDrawableResID, int VectorColor, DrawablePosition position) {
    Drawable drawable = VectorDrawableCompat.create(context.getResources(), vectorDrawableResID, null);
    DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(drawable, VectorColor);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
    switch (position) {
        case Left:
            button.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
            break;
        case Bottom:
            button.setCompoundDrawablesWithIntrinsicBounds(null, null, null, drawable);
            break;
        case Right:
            button.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
            break;
        case Top:
            button.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
            break;

    }

}

public static void placeVectorOnRadioButton(Context context, RadioButton radioButton, int vectorDrawableResID, int VectorColor, DrawablePosition position) {
    Drawable drawable = VectorDrawableCompat.create(context.getResources(), vectorDrawableResID, null);
    DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(drawable, VectorColor);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
    switch (position) {
        case Left:
            radioButton.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
            break;
        case Bottom:
            radioButton.setCompoundDrawablesWithIntrinsicBounds(null, null, null, drawable);
            break;
        case Right:
            radioButton.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
            break;
        case Top:
            radioButton.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
            break;

    }

}

public static void placeVectorOnCheckBox(Context context, CheckBox checkBox, int vectorDrawableResID, int VectorColor, DrawablePosition position) {
    Drawable drawable = VectorDrawableCompat.create(context.getResources(), vectorDrawableResID, null);
    DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(drawable, VectorColor);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN);
    switch (position) {
        case Left:
            checkBox.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
            break;
        case Bottom:
            checkBox.setCompoundDrawablesWithIntrinsicBounds(null, null, null, drawable);
            break;
        case Right:
            checkBox.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
            break;
        case Top:
            checkBox.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);
            break;

    }

}

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