【问题标题】:Android onTouch with onClick and onLongClick带有 onClick 和 onLongClick 的 Android onTouch
【发布时间】:2011-09-12 12:07:35
【问题描述】:

我有一个像按钮一样的自定义视图。我想在用户按下它时更改背景,当用户将手指移到外面或松开它时将背景恢复为原始背景,我还想处理 onClick/onLongClick 事件。问题是 onTouch 要求我为ACTION_DOWN 返回true,否则它不会向我发送ACTION_UP 事件。但如果我返回 true,onClick 监听器将无法工作。

我以为我通过在 onTouch 中返回 false 并注册 onClick 来解决它 - 它以某种方式起作用,但有点违反文档。我刚刚收到一位用户的消息,告诉我他无法长按该按钮,所以我想知道这里出了什么问题。

部分当前代码:

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

如何让它们正确地协同工作?

提前致谢

【问题讨论】:

    标签: android click touch


    【解决方案1】:

    onClick & onLongClick 实际上是从View.onTouchEvent 调度的。

    如果您覆盖View.onTouchEvent 或通过setOnTouchListener 设置一些特定的View.OnTouchListener, 你必须关心它。

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

    public boolean onTouch(View v, MotionEvent evt) { // 调度点击/长点击事件, // 你必须将事件传递给它的默认回调 View.onTouchEvent boolean defaultResult = v.onTouchEvent(evt); 开关(evt.getAction()) { 案例 MotionEvent.ACTION_DOWN: { 设置选择(真); // 只是改变背景 休息; } 案例 MotionEvent.ACTION_CANCEL: 案例 MotionEvent.ACTION_UP: 案例 MotionEvent.ACTION_OUTSIDE: { 设置选择(假); // 只是改变背景 休息; } 默认: 返回默认结果; } // 如果你到达这里,你已经消费了这个事件 返回真; }

    【讨论】:

    • @ranasaha 处理此事件已完成。检查所有与触摸事件相关的代码。仅报告 Doesent work 不会帮助您解决问题。在向我发布有关该事件的糟糕报告之前,请重新考虑为什么它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多