如何为TextView定义ColorStateList?

32

当我的ListViewItem被高亮时,我希望文本变为白色。我该如何定义呢?

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_focused="true" android:color="@color/testcolor1"/>
   <item android:state_pressed="true" android:state_enabled="false" android:color="@color/testcolor2" />
   <item android:state_enabled="false" android:color="@color/testcolor3" />
   <item android:color="@color/testcolor5"/>
 </selector>

我不确定我理解你的意思是什么? - Sheehan Alam
你为什么发布了这段代码?它展示了什么?(你如何使用drawable?) - Konstantin Burov
我不确定如何更改文本颜色。我以为它会在选择器代码中,但可能不是。所以我希望有人能回答这个问题,因为我不知道。 - Sheehan Alam
3个回答

69

创建文件 res/drawable/text_color.xml:

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:state_pressed="false" android:color="#ffffff" />
    <item android:state_focused="true" android:state_pressed="true" android:color="#ffffff" />
    <item android:state_focused="false" android:state_pressed="true" android:color="#ffffff" />
    <item android:color="#000000" />
</selector>

然后在您的列表视图项目中使用来自xml的@drawable/text_color(或来自代码的R.drawable.text_color)作为文本颜色。


谢谢!你能给我展示一下@drawable/text_color可能是什么样子的例子吗? - Sheehan Alam
2
就像在TextView上使用android:textColor="@drawable/text_color"一样。 - Konstantin Burov
49
应该放在res/color中。 - njzk2
4
是的,可以将其称为@color/text_color。@color 可以指向颜色或 ColorStateList。 - Eric Mill
7
如果您需要通过编程设置文本颜色,调用Context.getResources().getColorStateList(R.drawable.text_color)获取ColorStateList,并将其传递到EditText.setTextColor方法中接受ColorStateList的参数中。不要只是将资源ID作为整数传递进去(就像我之前做的一样...呃!)。 - DataGraham
@KonstantinBurov 如何定义自定义状态属性,而不是框架的 android:state_* - Sevastyan Savanyuk

8
试试这个...
首先,在“res/color”目录中创建一个名为“text_color.xml”的颜色状态列表。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    tools:ignore="MissingDefaultResource">
  <item android:color="#000000" android:state_enabled="false"/>
  <item android:color="#FFFFFF"/>
</selector>

第二步,使用。
getColorStateList(@NonNull Context context,
            @ColorRes int id)

获取颜色状态列表的方法。
textView.setTextColor(ContextCompat.getColorStateList(context, R.color.text_color))

第三步,根据您的需求启用(true)或禁用(false)。
textView.isEnabled = true //when item is highlighted

3

除了其他人上面提到的内容,我想强调一个点,取自以下url。

https://developer.android.com/reference/android/content/res/ColorStateList.html

注意:状态规范列表将按照它们在XML文件中出现的顺序进行匹配。因此,更具体的项目应该放在文件的前面。没有状态规范的项目被认为与任何状态集匹配,并且通常作为最后一个项目用作默认项非常有用。
在选择器标记中,底部的条件应该更加广泛,这一点非常重要。

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