Измените TintList для StateListDrawable внутри RippleDrawable
Объем
RippleDrawable имеет selector
как item
внутри. Оно работает.
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/pink_highlight">
<item
android:id="@android:id/mask"
android:drawable="@color/pink_highlight" />
<item
android:drawable="@drawable/bg_selectable_item" />
</ripple>
+
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/pink_highlight_focus" android:state_focused="true" />
<item android:drawable="@color/pink_highlight_press" android:state_pressed="true" />
<item android:drawable="@color/pink_highlight_press" android:state_activated="true" />
<item android:drawable="@color/pink_highlight_press" android:state_checked="true" />
<item android:drawable="@android:color/transparent" />
</selector>
проблема
Не могу изменить цвет состояния селектора по умолчанию с DrawableCompat.setTintList
RippleDrawable bg = (RippleDrawable)
ResourcesCompat.getDrawable(context.getResources(), R.drawable.bg_navigation_item, null);
StateListDrawable bgWrap = (StateListDrawable) DrawableCompat.wrap(bg.getDrawable(1));
DrawableCompat.setTintList(bgWrap, new ColorStateList(new int[][]{new int[]{}}, new int[]{Color.WHITE}));
//
someView.setBackground(bg);
Это не меняет состояние селектора по умолчанию, все остальное в порядке.
Решение
Проблема возникла из-за - неправильного понимания того, как должна работать тонировка;
- ColorStateList
лучше загружаться полностью;
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/pink_highlight">
<item>
<shape
android:shape="rectangle"
android:tint="@color/selectable_transparent_item" />
</item>
<item
android:id="@android:id/mask"
android:drawable="@color/pink_highlight" />
</ripple>
+
LayerDrawable bg = (LayerDrawable) ResourcesCompat.getDrawable(context.getResources(), R.drawable.bg_selectable_item, null);
Drawable bgWrap = DrawableCompat.wrap(bg.getDrawable(0));
DrawableCompat.setTintList(bgWrap, context.getResources().getColorStateList(R.color.selectable_white_item));
someView.setBackground(bg);
2 ответа
Ты пробовал someView.setBackground(bgWrap)
? Вы устанавливаете оттенок на bgWrap
, но вам нужно также установить его в качестве фона, а не вашего старого фона.
РЕДАКТИРОВАТЬ: Вы уверены, что setTintList
прослушивается? Следующий код работает для меня на всех API >= 15 с AppCompat:
public static void tintWidget(View view, ColorStateList colorStateList) {
final Drawable originalDrawable = view.getBackground();
final Drawable wrappedDrawable = DrawableCompat.wrap(originalDrawable);
DrawableCompat.setTintList(wrappedDrawable, colorStateList);
view.setBackground(wrappedDrawable);
}
Проблема 172067: DrawableCompat#setTintList не работает на Lollipop и выше