数据绑定和 ColorStateList 选择器

Databinding and ColorStateList Selector

我有一个回收器视图,我需要使用其中一种颜色选择器(取决于数据绑定中的值)来更改 TextView 颜色。

我有两个选择器:

color/selector_item_text.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/white" android:state_checked="true" />
    <item android:color="@color/white" android:state_pressed="true" />
    <item android:color="@color/white" android:state_activated="true" />
    <item android:color="@color/black" />
</selector>

color/selector_item_textwithspecial.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/pink" android:state_checked="true" />
    <item android:color="@color/pink" android:state_pressed="true" />
    <item android:color="@color/pink" android:state_activated="true" />
    <item android:color="@color/orange" />
</selector>

然后我将它绑定到我的 TextView,如下所示:

<TextView android:text="@{data.displayPrice}"
    android:textColor="@{data.isSpecial ? @color/selector_item_textwithspecial : @color/selector_item_text}"
    style="@style/ProductPrice"/>

问题是 TextView 颜色总是橙色(如果它有特殊颜色)或黑色。选择永远不会改变颜色。但是,如果我删除数据绑定,它会按预期工作。

例如下面会让TextView变成粉色(选中时)和橙色(未选中时)

<TextView android:text="@{data.displayPrice}"
    android:textColor="@color/selector_item_textwithspecial"
    style="@style/ProductPrice"/>

知道如何解决这个问题吗?

谢谢...

我认为您需要使用 ContextCompat 来获取颜色。

<TextView android:text="@{data.displayPrice}"
    android:textColor="@{data.isSpecial ? @{ContextCompat.getColor(context, @color/selector_item_textwithspecial)} : ContextCompat.getColor(context, @color/selector_item_text)}"
    style="@style/ProductPrice"/>

而您需要在 xml 文件的根元素中声明上下文

tools:context="...."//path to your activity

想通了,看

使用android:textColor="@{data.isSpecial ? @colorStateList/selector_item_textwithspecial : @colorStateList/selector_item_text}"