如何在选定/聚焦的ListView项中更改字体颜色?

37

我正在努力应用这个在Android中看似简单的特效,但却没有发现任何直观的方法。

我有一个ListView,我成功地自定义了背景图片,使得选中的项目可以通过获取新的背景Drawable来突出显示。我创建了一个新的样式,在其中将android:listSelector属性设置为指向StateListDrawable,并在其中指定了每个状态要使用的Drawable。

然而,每个ListView项都是一个LinearLayout,其中包含两个TextView。我的目标是能够在父View被选择或按下时同时更改子View的文本颜色,就像背景Drawable一样。我知道有一个ColorStateList,但我没有成功地设置它。

有人成功实现过类似这样的效果吗?

谢谢。


这方面的信息并不是很多 - 当我为ListView使用自定义背景时,我遇到了同样的问题,这使得用户无法确定他们是否成功选择了一个项目。幸运的是,view拯救了一天。我在下面留下了答案 - 很棒的问题,因为我知道你的问题将有助于改善社区。 - AndrewPK
5个回答

69

当你的ListView由包含多个视图的布局组成时,这两种情况都不是可行的答案。你需要将你的子视图设置为:

android:duplicateParentState="true"

现在你可以使用其他人描述的方法来声明你的TextView颜色,例如使用选择器:

android:textColor="@drawable/my_row_selector"

我相信你已经知道,但选择器可以非常简单,如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="@color/white" />
    <item android:color="@color/black" />
</selector>

可以看到,@color 值是允许的。希望这可以帮助你。

另外 - android:state_pressed 与 AdapterView.OnItemClickListener 一起使用。


1
谢谢。还可以与花哨的choiceModes等一起使用。我只是将文本选择器的状态设置为与列表选择器中的状态匹配。 duplicateParentState 是关键。 - dokkaebi
@AndrewPK,老兄你太棒了! - Libathos
它不能在安卓4.3,4.4上运行。焦点文本颜色与正常颜色相同。 - lacas

23

在您的TextView属性中

android:textColor="@color/text_selector"

在 res/color text_selector.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="YOUR_CUSTOM_COLOR" />
    <item android:state_selected="true" android:color="YOUR_CUSTOM_COLOR" />
    <item android:color="YOUR_CUSTOM_COLOR" />
</selector>

我尝试了这样做,它运行得很好。 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#000000" /> <item android:state_selected="true" android:color="#000000" /> <item android:color="#B7B9E7" /> </selector> - Zeeshan Akhter
4
为了处理选择,使用以下代码:<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#fff"/> <item android:state_activated="true" android:color="#fff"/> <item android:color="#000" /> </selector> - Manuel Escrig
它在Android 4.3和4.4上无法工作,焦点文本颜色与普通颜色相同。 - lacas

11
为了使其在选择时起作用,请使用以下代码:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#fff"/>
    <item android:state_activated="true" android:color="#fff"/>
    <item android:color="#000" />
</selector>

显然,关键是state_activated="true"状态。


2

当您部署适用于Android 11+(HoneyComb+)的应用程序时,您应该使用

android:state_activated="true"

对于已选列表状态。 在早期版本中,使用以下组合:

android:state_checked="true"
android:state_activated="true"

Of course don't forget to include the

android:duplicateParentState="true"

因此,视图可以从父列表项获取已激活/选中状态。


1
你可以创建一个res/color文件夹,并添加一个名为"text_selector.xml"的文件,其中包含以下行:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:color="#f0f"/>
    <item android:state_pressed="true" android:color="#f0f"/>
    <item android:color="#000"/>
</selector>

之后在TextView中分配:
android:textColor="@color/text_selector"

很棒的解决方案,我尝试使用可绘制选择器但没有成功。 - Mr. Fish
@Mr.Fish,谢谢您! - CoolMind

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