如何使用setTextColor(ColorsStateList colors)设置文本颜色?

49

当状态改变(按下、聚焦)时,我需要更改文本颜色...

如何使用ColorsStateList设置TextView的文本颜色?


你读过这个吗?https://dev59.com/CnA75IYBdhLWcg3wB0ZP - Plamen Nikolov
你的问题不够明确 - 你只是在寻找有关使用ColorStateList的教程吗?你有进行过任何搜索吗?https://dev59.com/tm865IYBdhLWcg3wat2l - Nathan Fig
是的,但我不能使用XML。我需要以编程方式完成这个。 - Rodrigo
3个回答

79

如果您需要在代码中设置颜色(使用ColorStateList),但仍想将颜色状态保存在XML中,您可以使用以下方法:

try {
    XmlResourceParser parser = getResources().getXml(R.color.your_colors);
    ColorStateList colors = ColorStateList.createFromXml(getResources(), parser);
    mText.setTextColor(colors);
} catch (Exception e) {
    // handle exceptions
}

res/color/your_colors.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true"
          android:color="#222222"/>
    <item android:state_selected="true"
          android:color="#222222"/>
    <item android:state_focused="true"
          android:color="#222222"/>
    <item android:color="#0000ff"/>
</selector>

105
有一种更简单的方法可以实现这个:mText.setTextColor(getResources().getColorStateList(R.color.your_colors)); - ol_v_er
@ol_v_er,如果你这样设置它,它似乎无法保留颜色状态(至少对我来说不是这样)。为了保留所选的颜色状态等,我必须使用上面的方法。 - Pete Lada
它什么时候不会保留颜色状态?当配置更改发生时吗? - ol_v_er
2
Ol_v_er的方法(在第一条评论中而不是答案中)对我非常有效,所有状态都得到了保留(Android 2.3和4.4)。 - javaxian
仅供2017年更新,更好的方法现在应该是:mText.setTextColor(ContextCompat.getColorStateList(getContext(), R.color.my_color_statelist); - Chris

28

您需要使用 getColorStateList() 方法。

我曾经也遇到过这个问题,如果您想要使用一个状态列表(state list),您需要在 color 资源文件夹中声明它,而不是 drawable 文件夹,并使用 setTextColor(getResources().getColorStateList(R.color.your_colors)) 方法。


这对我来说是解决方案。Android Studio 2.3在'drawable'文件夹中的选择器显示非常不一致。有时它会工作,有时它会变得混乱,并将所有文本都涂成粉色。通过添加一个“颜色”资源文件夹并将选择器XML文件放入其中,一切都变好了。 - Neil B

6
您可以使用ContextCompat加载颜色状态列表。
ColorStateList colors = ContextCompat.getColorStateList(this,R.color.my_color_list);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接