android - 在 RippleDrawable 中为 StateListDrawable 更改 TintList

标签 android android-drawable rippledrawable statelistdrawable

范围

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

最佳答案

你试过 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);
}

关于android - 在 RippleDrawable 中为 StateListDrawable 更改 TintList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31192375/

相关文章:

java - TCP 扫描 : Unexpected Socket Exceptions

android - Android Studio 的 "No tests were found"

android - VideoView 抛出 IllegalStateException

上传图片时出现android studio错误

android - 如何在android中使用xml绘制形状

android - 可绘制资源缩放的良好实践

android - 具有默认对话框外观和感觉的自定义对话框 - 这可能吗?

android - 如何处理 9-p​​atch 和 CardView 上的 Ripple 效果,并控制选择器的状态?

Android 波纹效果被选定状态覆盖

android - 具有透明背景的形状上的波纹