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;
    }
}
);

默认颜色为浅蓝色。我想为每个列表项更改它。此代码在触摸时将项目颜色更改为红色,但之后不会变回。

4

3 回答 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>

然后稍后您将视图的背景设置为: android:background="@color/mycolors" 在布局 xml 中或以编程方式如下: v.setBackgroundColor(getResources().getColor(R.color.mycolors);

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

更多关于它:http: //developer.android.com/guide/topics/resources/color-list-resource.html

于 2012-10-04T22:11:02.220 回答
1

你也试着抓住ACTION_CANCEL了吗?

所以...

...
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
    v.setBackgroundColor(Color.WHITE);
     break;
...

我认为 ListView 正在接收触摸事件,因为它开始滚动。所以你永远不会得到一个向上的动作,而是一个取消动作(我假设)。

于 2012-10-04T22:01:48.680 回答
-1

使用 statelistdrawable。您可以在各处找到示例,包括 Android 开发者网站。

于 2012-10-04T21:56:28.553 回答