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(…),它可以正确启动,并且由目标处理掉的数据。只是开始和结束事件没有触发。(编辑后的帖子要清晰)