为什么DragEvent.ACTION DROP被调用两次

时间:2014-04-30 11:43:59

标签: android

使用DragListenerClass时:

protected class myDragEventListener implements View.OnDragListener {

    @Override
    public boolean onDrag(final View v, DragEvent event) {

        final int action = event.getAction();   

        switch (action) {

            case DragEvent.ACTION_DRAG_STARTED: 
                break;
            case DragEvent.ACTION_DRAG_ENDED :
            case DragEvent.ACTION_DRAG_EXITED :
            case DragEvent.ACTION_DROP:

                Log.d("DROP", "DROP");

                if((ViewGroup) dragView.getParent() != null)
                    ((ViewGroup) dragView.getParent()).removeView(dragView);
                main_layout.addView(dragView,currentViewIndexUnderDragView);

                break;
            case DragEvent.ACTION_DRAG_LOCATION:    
                break;                          
        }
        return true;
    }
}

使用这样的拖动侦听器类:

final myDragEventListener dragListener = new myDragEventListener();     
main_container.setOnDragListener(dragListener);

拖动就像这样开始:

onLongClickListener = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {                

            v.startDrag(null,new View.DragShadowBuilder(v), null, 0);               

            main_layout.removeView(v);
            dragListener.dragView = v;              

            return true;
        }
    };  

问题是掉线被叫了两次,我不知道为什么或我做错了什么。

1 个答案:

答案 0 :(得分:1)

实际事件DragEvent.ACTION_DROP仅发生一次,但您对三个不同的事件使用相同的代码。拖动结束后({drop>退出操作)会发生DragEvent.ACTION_DRAG_ENDED并再次执行您的代码。我建议将其拆分为自己的case或完全删除它。

您可以在此处了解所有行动行为http://developer.android.com/reference/android/view/DragEvent.html