web-dev-qa-db-fra.com

DrawableCompat setTint ne fonctionne pas sur l'API 19

J'utilise DrawableCompat pour teinter comme indiqué ci-dessous, la teinte ne semble pas fonctionner sur l'API 19. J'utilise la version de support lib 23.3.0 

Drawable drawable = textView.getCompoundDrawables()[drawablePosition];
if (drawable != null) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
            drawable.setTint(color);
        } else {
            DrawableCompat.setTint(DrawableCompat.wrap(drawable), color);
        }
    }
15
3xplore

J'ai eu le même problème. J'ai combiné les messages dans https://stackoverflow.com/a/30928051 et essayé les API 17, 19, 21, 22, 23 et N Preview 3 avec SupportLib 23.4.0 pour trouver une solution.

Même s'il est mentionné que la classe de compatibilité utilisera un filtre pour les périphériques pré-Lollipop (voir https://stackoverflow.com/a/27812472/2170109 ), cela ne fonctionne pas.

Maintenant, je vérifie moi-même l'API et utilise le code suivant, qui fonctionne sur toutes les API testées (à partir de 17 ans).

    // https://stackoverflow.com/a/30928051/2170109
    Drawable drawable = DrawableCompat.wrap(ContextCompat.getDrawable(context, R.drawable.vector));
    image.setImageDrawable(drawable);

    /*
     * need to use the filter | https://stackoverflow.com/a/30880522/2170109
     * (even if compat should use it for pre-API21-devices | https://stackoverflow.com/a/27812472/2170109)
     */
    int color = ContextCompat.getColor(context, R.color.yourcolor);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
        DrawableCompat.setTint(drawable, color);

    } else {
        drawable.mutate().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
24
hardysim

Fonctionne sur API 15-25 avec AppCompat Support Library (testé sur les versions 24.1.1 et supérieures).

public static Drawable getTintedDrawable(@NonNull final Context context,
                                         @DrawableRes int drawableRes, @ColorRes int colorRes) {
    Drawable d = ContextCompat.getDrawable(context, drawableRes);
    d = DrawableCompat.wrap(d);
    DrawableCompat.setTint(d.mutate(), ContextCompat.getColor(context, colorRes));
    return d;
}
13
localhost

Je pense qu'après avoir emballé votre dessin, vous devez appeler mutate() dessus. Voir ceci: https://stackoverflow.com/a/30928051/3032209

1
Yair Kukielka

val textInput = EditText(context)

val drawable = ContextCompat.getDrawable(context, R.drawable.your_drawable)
        drawable?.let { myDrawable ->
            DrawableCompat.setTint(myDrawable, ContextCompat.getColor(context, R.color.your_color))
            textInput.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, myDrawable, null)
        }

0
Crazy

basé sur @localhost answer

Drawable d = DrawableCompat.wrap(ContextCompat.getDrawable(this, R.drawable.ic_rate));
DrawableCompat.setTint(d, Color.parseColor("#AAAAAA"));
l.setLogo(d);

J'ai essayé sur API 19> 25 et ça marche bien

0
JFouad

J'ai créé la méthode d'assistance suivante pour définir une couleur à dessiner et cela fonctionne au moins du niveau 16 à x de l'API. La couleur est une couleur à thème et est donc résolue via un attribut.

  public static Drawable getTintedDrawable(int drawableResourceId, int colorAttribute) {
    YourApplication = YourApplication.getInstance();
    Drawable drawable = ContextCompat.getDrawable(application, drawableResourceId);
    drawable = DrawableCompat.wrap(drawable);
    int tintColor = ContextCompat.getColor(application, application.getThemedResourceId(colorAttribute));
    DrawableCompat.setTint(drawable, tintColor);
    return drawable;
  }

Sans drawable.wrap, cela fonctionne sur les versions supérieures mais pas sur les API niveau 16.

0
Diego Frehner