按下时以编程方式使TextView背景颜色发生变化

时间:2014-07-07 02:08:23

标签: android android-layout

我有一些TextViews,它们被动态地添加到LinearLayout中。这些TextViews是可点击的并且有一个onLongClickListener(我还打算稍后添加onClickListener)

这就是事情,我希望这些TextView在按下时改变它们的背景颜色,我读到你可以使用选择器来做这样的事情。

所以我在res / drawable / text_view_pressed.xml中创建了这个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="#000000"/>
    <item android:state_pressed="false"
        android:color="#FFFFFF"/>
</selector>

我尝试创建一个TextView,使用这个xml文件就像这样:

TextView t = new TextView(this);
t.setBackgroundColor(R.drawable.text_view_pressed);

但是当我这样做时,它会在t.setBackgroundColor中给出这个错误:“应该在这里传递已解析的颜色而不是资源ID:getResources()。getColor(R.color.text_view_pressed)”但它不起作用如果我使用getResources()。getColor(R.color.text_view_pressed)。

任何人都知道该怎么做?

1 个答案:

答案 0 :(得分:2)

你走在正确的轨道上。但是有一个重要的细节。

状态可能会影响两种类型的资源:ColorStateListStateListDrawable

颜色状态列表只能在某些上下文中使用,例如TextView.setTextColor()。据我所知,如果要在按下时更改视图的背景,则不能将颜色状态列表用作setBackgroundColor()的参数。你需要一个可绘制的状态列表。在状态列表drawable中,android:drawable属性是必需的。

所以,总结一下:

  • xml文件应放在res\drawable
  • 其结构应略有不同(即状态列表,而不是颜色列表)和
  • 您需要使用setBackgroundResource()代替setBackgroundColor()

示例文件:

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

如果您想使用自定义颜色而不是白色和黑色,只需define them as resources in res\values并从此处引用它们。