将TextView拖动到EditText中



我是android编程的新手,我正在尝试将文本视图拖动到edittext中。

我创建了一个OnTouchListener,它在文本视图中选择文本并将其存储为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;
        }
    });

问题:

当我完成拖动时,文本视图的两个实例被附加到edittext。

示例:

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

放入EditText后:"我想拖动这个,我想拖动它"

我不明白为什么应该有两个drop,因为我在编辑文本时高估了onDrag。我还处理了所有的DragEvent操作。

编辑:查看日志后,即使删除了DragListener ,我也会看到此消息

11-20 07:30:04.885: I/ViewRootImpl(3518): Reporting drop result: true

对ViewRootImpl可能是什么有任何见解吗?

会发生这种情况,因为它会重复拖动,因此可以避免如下情况:附加文本如下:

创建布尔变量isDroping=false超出阻力等级

当您开始拖动时,使isDropping=true;

在下降:

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

我已经用过你的代码并检查过了,

我知道,在没有实现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;
    }
});

我意识到,将要删除的文本的MIME_TYPE从纯文本更改为html解决了这样的问题:

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

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

通过这种方式,编辑文本将剪辑数据视为html,而不会自动执行拖动操作。感谢所有的回答

您错过了返回值

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以上。。。

感谢

最新更新