Android 防止将自定义mimetype拖放到EditText
我有一个自定义mime类型,我打算使用它在应用程序中拖放应用程序对象。这似乎是可行的,但我发现EditText字段也接受删除操作。我不想发生这种事 首先,我定义了custome mime类型,如下所示:Android 防止将自定义mimetype拖放到EditText,android,drag-and-drop,android-edittext,mime-types,Android,Drag And Drop,Android Edittext,Mime Types,我有一个自定义mime类型,我打算使用它在应用程序中拖放应用程序对象。这似乎是可行的,但我发现EditText字段也接受删除操作。我不想发生这种事 首先,我定义了custome mime类型,如下所示: public static final String MIME_TYPE_MYNODE = "com.example.mockup/mynode"; 然后,在源对象的onTouch处理程序中,我有: @Override //-------------------------------
public static final String MIME_TYPE_MYNODE = "com.example.mockup/mynode";
然后,在源对象的onTouch处理程序中,我有:
@Override
//-----------------------------------------------------------------------------
public boolean onTouch (View v, MotionEvent e)
{
...
else if (e.getAction() == MotionEvent.ACTION_MOVE)
{
String[] mimeTypes = {MIME_TYPE_MYNODE};
ClipData data = new ClipData ("Task Tamer Note", mimeTypes, new ClipData.Item ("unused"));
View.DragShadowBuilder shadow = new View.DragShadowBuilder(this);
Object localState = v;
startDrag (data, shadow, localState, 0);
return false;
}
}
...
}
当我“删除”EditText小部件时,它会将“未使用”插入文本区域。我怎样才能防止这种情况?
谢谢。我遇到了一个类似的问题,因为我不希望布局接受删除操作 通过setOnDragListener将拖动侦听器附加到编辑字段
edtText.setOnDragListener(new MyDragListener());
检查onDrag事件中的目标视图是否为编辑文本
class MyDragListener implements OnDragListener {
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DROP:
//check whether it has been dropped onto your edit text
if(v!=edtText)
//your code here
}
你可以写信
edit.setEnabled(false);
edit.setFocusable(false);
调用startDrag()
,并在DragEvent.ACTION\u DRAG\u结束后恢复该特定editText
控件的旧值
但是,老实说,这是一种相当肮脏的做法。我也遇到过同样的行为。我已经找到了原因,它位于TextView类中
onDragEvent(DrageEvent事件)方法在这里被覆盖,如下所示
@Override
public boolean onDragEvent(DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
return mEditor != null && mEditor.hasInsertionController();
case DragEvent.ACTION_DRAG_ENTERED:
TextView.this.requestFocus();
return true;
case DragEvent.ACTION_DRAG_LOCATION:
final int offset = getOffsetForPosition(event.getX(), event.getY());
Selection.setSelection((Spannable)mText, offset);
return true;
case DragEvent.ACTION_DROP:
if (mEditor != null) mEditor.onDrop(event);
return true;
case DragEvent.ACTION_DRAG_ENDED:
case DragEvent.ACTION_DRAG_EXITED:
default:
return true;
}
}
如果可以插入text=>EditText,则任何拖动都将在此处处理并接受。
视图类未使用OnDragListener,因此无法通过
editText.setOnDragListener(null);
这里的解决方案是将EditText子类化为here并重写onDragEvent()方法:
}
现在,您的编辑文本将只接受带有MIMETYPE\u TEXT\u PLAIN的拖动。如果您想禁用拖放,只需在此方法中返回false`
@Override
public boolean onDragEvent(DragEvent event) {
return false;
}
就这样。
希望这会有帮助
返回
如果成功处理拖动事件,则为true;如果未处理拖动事件,则为false。请注意,false将触发视图调用其onDragEvent()处理程序
这是onDrag文档中的语句(视图v,DrageEvent事件)。因此,如果返回false,则事件由EditText的onDragEvent()处理。因此,最简单的解决方案是:
editText.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
return true;
}
});
如果要执行某些功能,请根据拖动事件进行指定,然后将执行这些功能。找到答案了吗?还没有。我一直听其自然,希望我能偶然发现一些东西或得到回应:)有什么解决办法吗?有相同的问题,无法找到解决方案。我所做的是:首先,我为edittext的父视图实现了拖动事件,在第一次调用时,我将edittext
设置为enabled
,focusable
和active
设置为false
,并且,魔术发生了-edittext
第一次接收到drop,而不会在接下来的所有时间接收drop。可能是什么?谢谢。当我回到我的应用程序的那个部分时,我会尝试这个。我认为这是EditText小部件中的一个bug,但你的解决方法似乎很好。这对我来说不起作用。实际上,我认为这种行为不是由drop事件引起的,而是由paste事件引起的。我这样认为是因为您需要ClipData
进行复制/粘贴,而这种行为预期非常相似。现在我在想如何区分这两件事。我从来没有试过。相反,我最终实现了自己的最小拖放。因为我有一些特殊的需要,比如拖动时滚动(也需要避免主题问题),所以我决定从头开始比较容易。实现拖放有一些棘手的方面,但结果非常棒@佩里哈特曼哈,我有同样的问题滚动,我已经实现了自己。此外,我几乎修复了edittext
接收丢弃事件的错误,但非常脏:/您可能有正确的解决方案。我不会亲自尝试(无论如何,在不久的将来)。如果有人能插话来验证它是否有效,那就太好了。谢谢你的好帖子!除非我将EditText子类化,否则我无法控制它的OnDragListener。或者您还有其他想法吗?设置拖动侦听器不会覆盖默认实现吗?是的,我认为会。但随后您将失去默认功能。也许重新实现这一点并不难——不确定。
editText.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
return true;
}
});