Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OnDragListener未接收到DRAG\u已启动或DRAG\u已结束,但确实获得操作\u DROP_Android_Drag And Drop - Fatal编程技术网

Android OnDragListener未接收到DRAG\u已启动或DRAG\u已结束,但确实获得操作\u DROP

Android OnDragListener未接收到DRAG\u已启动或DRAG\u已结束,但确实获得操作\u DROP,android,drag-and-drop,Android,Drag And Drop,我在使用OnDragListener时遇到了一个奇怪的问题。我的目标视图获得ACTION\u DROP事件并对其进行处理;但它从未接收到动作拖动\u开始或动作拖动\u结束事件(事实上,它从未接收到除拖放之外的任何事件) 这可能是什么原因造成的?这是一个问题,因为我无法处理掉在目标之外的情况 我发现了,但我不清楚答案。非常感谢您的任何想法 我的可拖动视图在TouchListener上有以下内容: @Override public boolean onTouch(View v, MotionEven

我在使用
OnDragListener
时遇到了一个奇怪的问题。我的目标视图获得
ACTION\u DROP
事件并对其进行处理;但它从未接收到
动作拖动\u开始
动作拖动\u结束
事件(事实上,它从未接收到除拖放之外的任何事件)

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

我发现了,但我不清楚答案。非常感谢您的任何想法

我的可拖动视图在TouchListener上有以下内容:

@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;
}
@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;
}
目标视图具有以下内容:
OnDragListener

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

我就是这样做的。我不知道它是否会为你工作,但仍然张贴

@Override
public boolean onTouch(View v, MotionEvent event) {
         final ClipData data = ClipData.newPlainText("position",position + "");
         v.startDrag(data, pieceDragShadowBuilder, v, 0);
         return true;
}
然后在我的听众中:

                @Override
                public boolean onDrag(View pV, DragEvent pEvent) {
                  final int dragAction = pEvent.getAction();

                  View dragView = (View) pEvent.getLocalState();
                  final FrameLayout container = (FrameLayout) pV;

                            if (dragAction == DragEvent.ACTION_DRAG_STARTED)
                            {

                            } 
                            else if (dragAction == DragEvent.ACTION_DRAG_ENTERED)
                            {

                            }
                            else if (dragAction == DragEvent.ACTION_DRAG_EXITED) 
                            {

                            } 
                            else if (dragAction == DragEvent.ACTION_DROP) 
                            {

                            }

现在,我从您的代码中看到的唯一区别是,我正在调用我的
onTouch()
中的
startDrag()
方法,而不考虑移动、向上或取消的特定事件。

我的解决方案是这样一种变通方法:当我的
OnTouchListener
获得操作时,设置1秒延迟runnable以检查视图是否仍在拖动。如果
OnDragListener
接收到丢弃,则runnable不执行任何操作;但如果没有,runnable调用将停止拖动以清理并将视图重置为其以前的位置

case MotionEvent.ACTION_UP:
  if (isOnClick) {
    isOnClick = false;
    // handle single click
  } else if (draggableView.isDragging()) {
    uiHandler.postDelayed(new Runnable() {
      @Override
      public void run() {
        if (draggableView.isDragging()) {
          // Drop never got received, so call stopDrag
          draggableView.stopDrag();
        }
      }
    }, 1000);
  }
  break;

这是ViewGroup的一个已知问题:

在该链接上建议重写DispatchDrageEvent函数对我来说很有效:

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

您没有在可拖动视图的OnTouch中调用startDrag()方法。代码中要开始拖动的注释部分是否尝试调用startDrag()?是的,对不起,我只是为了在此处发布而注释掉了该部分。但是我调用的是draggableView.startDrag(…),它可以正确启动,并且由目标处理掉的数据。只是开始和结束事件没有触发。(编辑后的帖子要清晰)