安卓 ListView 选择器颜色

73

大家好,

我有两个关于Android中的ListView的问题:

  1. 如何获取listview的聚焦行的颜色? 我试图使用 ListView.getSelector() 方法,根据文档应该可以得到我要找的内容,但是它给我返回一个Drawable对象,我不知道如何从中检索颜色(如果可能...)。

  2. 如何设置listview的聚焦行的颜色? 这里我尝试在listview上使用 setSelector()方法,传递一个ColorDrawable对象,但是这样做的结果是整个列表视图的背景都被涂成了那种颜色... 当然这不是我想要的...

谢谢!


这可能会有所帮助(包含问题和解决方案):https://dev59.com/43I95IYBdhLWcg3w-DL0 - Uroš Milivojević
似乎Android 2中存在一个错误,导致颜色影响整个背景 - 请检查我的答案,其中链接到另一个问题提供的解决方法。 - Richard Le Mesurier
2个回答

89

列表选择器的可绘制对象是一个StateListDrawable,它包含对于列表的每个状态(如选中、聚焦、按下、禁用等)的多个可绘制对象的引用...

虽然你可以使用getSelector()方法检索可绘制对象,但我不认为你可以从StateListDrawable中检索到特定的Drawable,也似乎无法直接从ColorDrawable中以编程方式检索颜色。

至于设置颜色,你需要像上面描述的那样使用StateListDrawable。你可以在XML中定义这个可绘制对象,并使用android:listSelector属性将其设置在你的列表上:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_enabled="false" android:state_focused="true"
        android:drawable="@drawable/item_disabled" />
  <item android:state_pressed="true"
        android:drawable="@drawable/item_pressed" />
  <item android:state_focused="true"
        android:drawable="@drawable/item_focused" />
</selector>

12
我还会将列表选择器分配给自定义主题,这样您应用程序中的所有列表看起来都一样。 <item name="android:listSelector">@drawable/my_list_highlight</item> - Alex Volovoy
5
这在API 7/8上不起作用,至少是这样。当按下时,它似乎会将整个背景色改为相同的按下颜色,包括其他行的背景以及行之间的边距线(我使用的是黑色)。 - Jonny
@Jonny,当我使用drawable时它对我有效,但是当我使用颜色时无效。我已经添加了一个答案,提供了一个适用于颜色的好解决方法。 - Richard Le Mesurier
你好,我正在尝试在我的ListView中使用选择器,就像你建议的那样,但它有9个PNG而不是颜色。此外,我有一个自定义布局,我在我的ListView中填充它,并将选择器用作该自定义布局的背景。你能给予建议吗? - Prateek

11

要添加的内容:如果您正在使用颜色而不是可绘制对象,则@Christopher's answer不适用于API 7/8(根据@Jonny的正确评论)。 (在我的测试中,使用Christopher提供的可绘制对象可正常工作)

以下是在使用颜色时针对2.3及以下版本的修复方法:

根据@Charles Harley的说法,在2.3及以下版本中,将列表项填充为颜色会导致颜色流到整个列表上。他的解决方法是定义一个包含所需颜色的形状可绘制对象,并使用该对象代替颜色。

如果您想要只使用颜色选择器并且针对Android 2进行定位(或至少允许Android 2),建议查看此链接。


2
刚刚又被这个问题困扰了,感谢你提醒我真正的问题所在。 - Reuben Scratton

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