防止将自定义mimetype拖放到EditText

我有一个自定义的MIMEtypes,我打算用于在应用程序中拖放应用程序对象。 这似乎是工作,但我发现EditText字段也接受放置操作。 我不想要这样的事情发生。

首先,我已经定义了这样的custome mimetypes:

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小部件上时,它将“未使用”插入到文本区域中。 我怎样才能防止这个? 谢谢。

Solutions Collecting From Web of "防止将自定义mimetype拖放到EditText"

我遇到了同样的行为。 我find了原因,它位于TextView类中。

onDragEvent(DragEvent事件)方法在这里被覆盖,如下所示。

 @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; } } 

如果可以插入文本=> EditText,那么任何拖动将被处理和接受。 View类不使用OnDragListener,所以不可能通过阻止这种行为

 editText.setOnDragListener(null); 

这里的解决scheme是在这里inheritanceEditText的子类并覆盖onDragEvent()方法:

  public class YourEditText extends EditText { ... // other stuff ... @Override public boolean onDragEvent(DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) { return true; } return false; default: return super.onDragEvent(event); } } 

}

现在YourEditText将只接受带有MIMETYPE_TEXT_PLAIN的拖动。 如果你想禁用拖放,只需在这个方法中返回false

 @Override public boolean onDragEvent(DragEvent event) { return false; } 

就是这样。 希望它会有所帮助。

我遇到了类似的问题,我不希望布局接受放置操作。

通过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_DRAG_ENDED之后为特定的editText控件恢复旧值。

但是,说实话,这是非常肮脏的做法。

如果拖动事件已成功处理,则返回true;如果未处理拖动事件,则返回false。 请注意,false将触发视图来调用其onDragEvent()处理程序。

这是来自onDrag(View v,DragEvent事件)文档的声明。 所以如果你返回false,那么事件由EditText的onDragEvent()来处理。 因此最简单的解决scheme是:

 editText.setOnDragListener(new OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { return true; } }); 

如果你想执行某些function,请根据Drag事件指定它们并执行。