带onClick和onLongClick的Android onTouch

我有一个自定义视图,就像一个button。 我想在用户按下时更改背景,当用户将手指移动到外部或将其释放时,将背景恢复为原始,并且还要处理onClick / onLongClick事件。 问题是,onTouch要求我为ACTION_DOWN返回true,否则不会向我发送ACTION_UP事件。 但是,如果我返回true onClick侦听器将无法正常工作。

我以为我通过在onTouch中返回false并注册onClick来解决它 – 它以某种方式工作,但有点反对文档。 我刚刚收到用户告诉我的消息,他不能长按button,所以我想知道这里有什么问题。

部分当前代码:

 public boolean onTouch(View v, MotionEvent evt) { switch (evt.getAction()) { case MotionEvent.ACTION_DOWN: { setSelection(true); // it just change the background break; } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_OUTSIDE: { setSelection(false); // it just change the background break; } } return false; } public void onClick(View v) { // some other code here } public boolean onLongClick(View view) { // just showing a Toast here return false; } // somewhere else in code setOnTouchListener(this); setOnClickListener(this); setOnLongClickListener(this); 

我如何让他们一起正常工作?

提前致谢

Solutions Collecting From Web of "带onClick和onLongClick的Android onTouch"

onClickonLongClick实际上是从View.onTouchEvent

如果您重写View.onTouchEvent或通过setOnTouchListener设置一些特定的setOnTouchListener ,则必须注意这一点。

所以你的代码应该是这样的:

 public boolean onTouch(View v,MotionEvent evt)
 {
   //发送点击/长按事件,
   //您必须将事件传递给它的默认callbackView.onTouchEvent
   boolean defaultResult = v.onTouchEvent(evt);

  开关(evt.getAction())
   {
    大小写MotionEvent.ACTION_DOWN:
     {
      为setSelection(真);  //只是改变背景
      打破;
     }
    大小写MotionEvent.ACTION_CANCEL:
    大小写MotionEvent.ACTION_UP:
    案例MotionEvent.ACTION_OUTSIDE:
     {
      为setSelection(假);  //只是改变背景
      打破;
     }
    默认:
      返回defaultResult;
   }

   //如果你到达这里,你已经消耗了这个事件
  返回true;
 }