我是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以上。。。
感谢