Подтвердить что ты не робот

DrawableCompat setTint не работает с API 19

Я использую DrawableCompat для тонирования рисования, как показано ниже, кажется, что тонирование не работает на API 19. Я использую библиотеку поддержки 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);
        }
    }
4b9b3361

Ответ 1

У меня была та же проблема. Я объединил сообщения в fooobar.com/questions/119964/... и попробовал API 17, 19, 21, 22, 23 и N Preview 3 с SupportLib 23.4.0, чтобы найти решение.

Даже если он упоминается, что совместимый класс будет использовать фильтр для pre-lollipop-устройств (см. fooobar.com/questions/119964/...), он не работает.

Теперь я сам проверяю API и использую следующий код, который работает со всеми проверенными API (для 17 и выше).

    // /questions/119964/android-tint-using-drawablecompat/735072#7350722170109
    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 | /questions/119964/android-tint-using-drawablecompat/735068#735068)
     */
    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);
    }

Ответ 2

Работает с API 15-25 с помощью библиотеки поддержки AppCompat (проверена 24.1.1 и выше).

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;
}

Ответ 3

Я думаю, что после обёртывания вашего drawable вам нужно будет вызвать mutate() для него. Смотрите это: fooobar.com/questions/119964/...

Ответ 4

на основе ответа @localhost

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

Я пробовал на API 19> 25, и он работает хорошо

Ответ 5

Я сделал следующий вспомогательный метод, чтобы установить drawable с tint, и он работает по крайней мере от уровня API 16 до x. Цвет является тематическим цветом и поэтому разрешается с помощью атрибута.

  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;
  }

Без drawable.wrap он работает на более высоких версиях, но не на уровне API 16.

Ответ 6

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)
        }