我想要的效果其实就是类似listview那样,每个项,单击时会变一下颜色,让人知道已经点击生效了。
不过我没用listview,是一些textview纵向排列的
每个textview的onclick事件里我这么设定来改变颜色public void onClick(View view)
{
    TextView textView=(TextView)view;
    Drawable background=textView.getBackground();
    textView.setBackgroundColor(0xFFCECECE);
    ............
    打开一个新的窗口
    textView.setBackgroundDrawable(background);
    //如果不写最后一行setBackgroundDrawable的话,是可以改变颜色的,这行代码是要恢复到原来的颜色
}
感觉这样应该是可以的吧
但是实际执行时,单击这个textview的话,背景颜色是不会有任何变化的。
请问这是为什么

解决方案 »

  1.   

    把最后一行去掉的话,背景色改变了,就变不回去了。其实我想做的效果是类似listview中的一项那样,被选中时会变一下橙黄色,然后又马上恢复正常颜色
      

  2.   

    老兄,你可能不是太熟悉 界面的渲染机制。 你调用setBackgroundColor,只是修改了属性,并没有真正刷新。 界面线程都是消息机制, 你本身是在click事件中调用的。 他必须repaint才会真正绘制。 所以在事件中写的任何属性更改都不是立时生效的。 =============
    至于你这个功能,可以用Timer实现。 设定比如500ms后再改一次。
      

  3.   

    谢谢
    你说了这个渲染机制我就明白了
    我还按windows平台的用法来搞,以为会实时渲染修改属性,两次修改背景色属性就行了。
      

  4.   

    可以实现OnTouchListener接口,实现 boolean onTouch(View v, MotionEvent event)方法
    当event.getAction() == MotionEvent.ACTION_DOWN,改变背景颜色
    当event.getAction() == MotionEvent.ACTION_UP,还原背景颜色
      

  5.   

    Android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate
    你可能是没更新textView.setBackgroundColor(0xFFCECECE);
    textView.invalidate();
    ............
        打开一个新的窗口
        textView.setBackgroundDrawable(background);试试
    如果还不行可能是打开新窗口太快了,刷新后用sleep延迟一下
      

  6.   

    恩,此法可行,我已按你说的办法实现了,监听touch事件可以实时改变颜色
      

  7.   

    textview = (TextView) findViewById(R.id.textview);
            textview.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    Drawable background=textview.getBackground();
    if(event.getAction() == MotionEvent.ACTION_DOWN){
    textview.setBackgroundColor(0xFFCECECE);
    }
    if(event.getAction() == MotionEvent.ACTION_UP){
    textview.setBackgroundDrawable(background);
    }
    return true;
    }
    });
    5楼的兄台,你看我这写的有问题吗?为什么我鼠标点下去textview变了颜色,但是鼠标离开他不返回原来的颜色呢?我用了textview.invalidate();也没效果....求指点~~
      

  8.   


    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
    testView.setBackgroundDrawable();
    return true;
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
    testView.setBackgroundDrawable ();
    return false;
    }
    return false;
    }
      

  9.   

    嗯嗯,是正解,谢谢~~我再贴下
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    Drawable background=textview.getBackground();
    if(event.getAction() == MotionEvent.ACTION_DOWN){
    textview.setBackgroundColor(0xFFCECECE);
    //textview.setBackgroundDrawable();
    return true;
    }
    if(event.getAction() == MotionEvent.ACTION_UP){
    textview.setBackgroundColor(000000);
    return false;
    }
    return false;
    }
      

  10.   

    给TEXTVIEW添加背景吧
    android:background="@drawable/my_button_click"
    背景就调用这个my_button_click,这是自己写的一个XML
    XML的类容就是下边的,你可以改成颜色或者图片用
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:drawable="@drawable/login_button_sel" android:state_focused="true"/>
        <item android:drawable="@drawable/login_button_sel" android:state_pressed="true"/>
        <item android:drawable="@drawable/login_button_sel" android:state_selected="true"/>
        <item android:drawable="@drawable/loginbutton"/>
    </selector>
      

  11.   

    这个我看得不是很懂,主要是不熟悉selector这个元素
      

  12.   

    到后来我发现,这么实现,其实是有很大问题的。
    按下,然后移动到别的地方抬起手指,再触发OnTouch的up事件时,跟这个textview没一点关系了,背景色不会改回来了
      

  13.   

    我后来试了下,在一次click事件中,还是不能够改变颜色再恢复,我用invalidate()刷新后,线程停500ms,然后再改回颜色。最后的事实时,界面颜色直接改回原来颜色了,中途没有变化
      

  14.   

    随便建个XML文件。将我写的那些复制进去就好了。没你想的那么高深!
      

  15.   

    恩,你说的对。我之前已经弄好这个变色了,就是用selector改变的。感谢你