如何在触摸项目时设置自定义背景颜色?

4

我想在列表项被点击时自定义其背景颜色。我尝试编写了一个监听器,但似乎出现了某种错误或者我误解了这些操作的概念。

v.setOnTouchListener( new TextView.OnTouchListener() {

    public boolean onTouch(View v, MotionEvent event) {
            switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                v.setBackgroundColor(Color.RED); 
                    break;
            case MotionEvent.ACTION_UP:
                v.setBackgroundColor(Color.WHITE);
                break;
            }

    return false;
    }
}
);

默认颜色是浅蓝色。我想为每个列表项更改它。这段代码在被点击时将项目的颜色更改为红色,但此后它不会自动变回原来的颜色。


你应该返回 true,就像这里写的一样:https://dev59.com/41_Va4cB1Zd3GeqPYfTc#27739621。 - CoolMind
3个回答

5
也许最好使用颜色状态...在颜色文件夹中创建一个名为mycolors.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="#ff0000"/> <!-- pressed -->
        <item android:color="#ffffff"/> <!-- default -->
    </selector>

然后您可以像这样在布局xml中设置视图的背景:android:background="@color/mycolors",或者像这样在程序中进行设置:v.setBackgroundColor(getResources().getColor(R.color.mycolors);

在这种情况下,不需要任何点击或触摸监听器...一切都会神奇地发生。

更多信息请参见:http://developer.android.com/guide/topics/resources/color-list-resource.html


3
android:background="@color/mycolors" 在我这里不起作用!它导致了布局填充时的异常。 - Alireza Mirian
1
@AlirezaMirian 这是因为在这种情况下,android:color 实际上应该是 android:drawable - Jon Cairns

1
你是否也尝试捕获 ACTION_CANCEL 了呢?
所以...
...
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
    v.setBackgroundColor(Color.WHITE);
     break;
...

我认为ListView正在拦截触摸事件,因为它开始滚动。所以你永远不会得到一个up-action,而是一个cancel-action(我猜测)。


-1

使用StateListDrawable。你可以在许多地方找到示例,包括Android开发者网站。


关键点在于您可以使用编程方式创建一个StateListDrawable,代码如下:StateListDrawable states = new StateListDrawable(); states.addState(new int[] {android.R.attr.state_pressed}, new ColorDrawable(color)); - Sylphe

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