将TextView拖动到EditText中

时间:2013-11-20 01:33:46

标签: android drag-and-drop

我是Android编程的新手,我正在尝试将textview拖到编辑文本中。

我创建了一个OnTouchListener,它选择textview中的文本并将其存储为ClipData。

OnTouchListener:

item.setOnTouchListener(new OnTouchListener(){

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        ClipData data = ClipData.newPlainText("text", str);
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        view.startDrag(data, shadowBuilder, view, 0);

    }
        return true;    
  }

});

然后我想将这些数据附加到EditText视图上。为此,我为EditText实现了一个OnDragListener

OnDragListener:

    TextStage.setOnDragListener(new OnDragListener(){

        @Override
        public boolean onDrag(View v, DragEvent event) {
            switch(event.getAction())
            {
                case DragEvent.ACTION_DRAG_STARTED: break;
                case DragEvent.ACTION_DROP: ClipData.Item item = event.getClipData().getItemAt(0);
                                            CharSequence paste = item.getText();
                                            v.append(paste.toString());                                         
                                            break;
                case DragEvent.ACTION_DRAG_ENDED: break;
                case DragEvent.ACTION_DRAG_EXITED: break;
                default: break;
            }

            return false;
        }

    });

问题:

当我完成拖动时,textview的两个实例将附加到edittext。

示例:

TextView中的字符串:"我想拖动它"

在EditText中删除后:"我想拖动它,我想拖动它"

我不知道为什么会有两滴,因为我已经在编辑文本上覆盖了.drag。 我还处理了所有DragEvent操作。

编辑:看到日志后,即使删除了DragListener

,我也会看到此消息
11-20 07:30:04.885: I/ViewRootImpl(3518): Reporting drop result: true

了解ViewRootImpl可能是什么?

4 个答案:

答案 0 :(得分:0)

它发生了,因为它重复拖动,所以你可以避免这样: 附加如下文字:

在拖拽类中创建布尔变量 isDropping = false;

当你开始拖动make isDropping=true;

在Drop:

case DragEvent.ACTION_DROP: 
ClipData.Item item = event.getClipData().getItemAt(0); 
CharSequence paste = item.getText();
if(isDropping){
v.append(paste.toString());
isDropping=false;
} break;

答案 1 :(得分:0)

我已经使用了您的代码并进行了检查,

我开始知道没有实现Draglistner它工作正常所以只需从项目中删除下面的整个代码它就可以正常工作。

 TextStage.setOnDragListener(new OnDragListener(){

    @Override
    public boolean onDrag(View v, DragEvent event) {
        switch(event.getAction())
        {
            case DragEvent.ACTION_DRAG_STARTED: break;
            case DragEvent.ACTION_DROP: ClipData.Item item = event.getClipData().getItemAt(0);
                                        CharSequence paste = item.getText();
                                        v.append(paste.toString());                                         
                                        break;
            case DragEvent.ACTION_DRAG_ENDED: break;
            case DragEvent.ACTION_DRAG_EXITED: break;
            default: break;
        }

        return false;
    }

});

答案 2 :(得分:0)

我意识到改变要删除的文本的MIME_TYPE,从明文到html解决了这个问题:

ClipData data = ClipData.newPlainText("text", str);

ClipData data = ClipData.newHtmlText("text", str,"");

这样,编辑文本将剪辑数据视为html,并且不会自动执行拖动操作。感谢所有答案

答案 3 :(得分:0)

你错过了返回值

TextStage.setOnDragListener(new OnDragListener(){

        @Override
        public boolean onDrag(View v, DragEvent event) {
            switch(event.getAction())
            {
                case DragEvent.ACTION_DRAG_STARTED: break;
                case DragEvent.ACTION_DROP: ClipData.Item item = event.getClipData().getItemAt(0);
                                            CharSequence paste = item.getText();
                                            v.append(paste.toString());                                         
                                            break;
                case DragEvent.ACTION_DRAG_ENDED: break;
                case DragEvent.ACTION_DRAG_EXITED: break;
                default: break;
            }
//return true working perfect
            return true;
        }

    });

htmltext仅在16 API以上工作...

谢谢