0

Nun, ich habe vor kurzem begonnen, VectorDrawables zu verwenden, und ich dachte, sie würden normalerweise in allen Android-Versionen funktionieren, aber es scheint, dass sie Abstürze in Pre-Lollipop-Geräten verursachen.Wie können Sie VectorDrawables richtig einfärben, damit sie in Pre-Lollipop-Geräten funktionieren?

Die Sache ist, ich bin ein getöntes ziehbar mit diesem Code zu erstellen:

Drawable tintedDrawable = getTintedIcon(
       ContextCompat.getDrawable(context, R.drawable.ic_android), 
       ThemeUtils.darkTheme ? light : dark); 

public static Drawable getTintedIcon(Drawable drawable, int color) { 
    if (drawable != null) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && drawable instanceof VectorDrawable) { 
      drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); 
     } 
     drawable = DrawableCompat.wrap(drawable.mutate()); 
     DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN); 
     DrawableCompat.setTint(drawable, color); 
     return drawable; 
    } else { 
     return null; 
    } 
} 

Nachdem die getönten ziehbar Schaffung ich es mit einem: imageView.setImageDrawable(tintedDrawable);

wie in Lollipop und neuerer Android erwartete Dies funktioniert Versionen, aber es in älteren Versionen nicht.

Nach Chris Banes' Medium post, kann ich entweder: app:srcCompat="@drawable/ic_android"

oder imageView.setImageResource(R.drawable.ic_android);

Aber was kann ich tun, wenn ich es programmatisch tönen müssen? Kann mir jemand helfen und/oder erklären?

Vielen Dank im Voraus.

Ich habe dies bereits in meiner build.gradle Datei, nur für den Fall:

android { 
    defaultConfig { 
    vectorDrawables.useSupportLibrary = true 
    } 
} 

Antwort

1

versuchen, dies zu Image zu erklären:

app:srcCompat="@drawable/ic_iconname"/> 

Aber vorher, wenn Sie gradle v2 verwenden. 0 +, fügen Sie diese zu Ihrer gradle:

vectorDrawables.useSupportLibrary = true 

Quelle: AppCompat - Age of the vectors

0

Nicht, wenn dies hilft, aber das ist der Code, den ich benutze und bis jetzt keine Probleme hatte.

public static boolean isAboveOrEqualAPILvl(int apiLvl) { 
    return Build.VERSION.SDK_INT >= apiLvl; 
} 

@TargetApi(Build.VERSION_CODES.M) 
public static int getResourceColor(@NonNull Context context, @ColorRes int id) { 
    if (isAboveOrEqualAPILvl(Build.VERSION_CODES.M)) { 
     return context.getColor(id); 
    } else { 
     //noinspection deprecation 
     return context.getResources().getColor(id); 
    } 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
@Nullable 
public static Drawable getIconDrawable(@NonNull Context context, @DrawableRes int drawableId, 
          int colorId, boolean isMutate) { 
    Drawable drawable; 
    if (isAboveOrEqualAPILvl(Build.VERSION_CODES.LOLLIPOP)) { 
     drawable = context.getDrawable(drawableId); 
    } else { 
     //noinspection deprecation 
     drawable = context.getResources().getDrawable(drawableId); 
    } 
    drawable = isMutate ? DrawableCompat.wrap(drawable).mutate() : DrawableCompat.wrap(drawable); 
    if (colorId>-2) { 
     DrawableCompat.setTint(drawable, getResourceColor(context, colorId)); 
    } 
    return drawable; 
} 

public static void changeDrawableTint(@Nullable Context context, @NonNull Drawable drawable, 
           @ColorRes int colorId) { 
    if (context==null) { return; } 
    DrawableCompat.setTint(drawable, getResourceColor(context, colorId)); 
}