android - OnDragListener 未收到 DRAG_STARTED 或 DRAG_ENDED,但收到 ACTION_DROP

标签 android drag-and-drop

我在使用 OnDragListener 时遇到了一个奇怪的问题。我的目标 View 很好地获取了 ACTION_DROP 事件并对其进行了处理;但它从不接收 ACTION_DRAG_STARTEDACTION_DRAG_ENDED 事件(事实上它从不接收除 drop 之外的任何事件)。

这可能是什么原因造成的?这是一个问题,因为我无法处理掉落发生在目标之外的情况。

我找到了 this question但我不清楚答案。非常感谢任何想法。

我的可拖动 View 有这个 OnTouchListener:

@Override
public boolean onTouch(View v, MotionEvent ev) {
  switch (ev.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
      startPointX = ev.getX();
      startPointY = ev.getY();
      isOnClick = true;
      break;
    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
      if (isOnClick) {
        isOnClick = false;
        // handle single click
      }
      break;
    case MotionEvent.ACTION_MOVE:
      if (isOnClick && movePassesThreshold(ev)) {
        isOnClick = false;
        draggableView.startDrag(...);
      }
      break;
    default:
      break;
  }
  return true;
}

目标 View 有这个OnDragListener:

@Override
public boolean onDrag(View v, DragEvent event) {
  switch (event.getAction()) {
    case DragEvent.ACTION_DRAG_STARTED:
      Log.v(TAG, "drag started");
      break;
    case DragEvent.ACTION_DRAG_ENTERED:
      break;
    case DragEvent.ACTION_DRAG_EXITED:
      break;
    case DragEvent.ACTION_DROP:
      Log.v(TAG, "drop");
      // handle drop
      break;
    case DragEvent.ACTION_DRAG_ENDED:
      Log.v(TAG, "drag ended");
      break;
    default:
      return false;
  }
  return true;
}

最佳答案

这是 ViewGroup 的一个已知问题:

https://code.google.com/p/android/issues/detail?id=25073

按照该链接中的建议覆盖 dispatchDragEvent 函数对我有用:

@Override
public boolean dispatchDragEvent(DragEvent ev){
    boolean r = super.dispatchDragEvent(ev);
    if (r && (ev.getAction() == DragEvent.ACTION_DRAG_STARTED
            || ev.getAction() == DragEvent.ACTION_DRAG_ENDED)){
        // If we got a start or end and the return value is true, our
        // onDragEvent wasn't called by ViewGroup.dispatchDragEvent
        // So we do it here.
        onDragEvent(ev);
    }
    return r;
}

关于android - OnDragListener 未收到 DRAG_STARTED 或 DRAG_ENDED,但收到 ACTION_DROP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19410949/

相关文章:

wpf - 无法让简单的 WPF 拖放工作

email - 来自 Thunderbird 的拖放处理

android - 如何获取android中已读消息的数量?

android - 导入android项目到eclipse时出错

java - 获取已保存图像文件的 Uri

android - 移动设备上的 Worldpay 通知

reactjs - 在 React 中全屏拖放文件

jquery - 缩放后拖放错误注册

windows - 拖放模拟?

android - 媒体元数据检索器 JNI (14060) : getFrameAtTime: videoFrame is a NULL pointer(Android)