我有一个自定义 MIME 类型,我打算用它在应用程序中拖放应用程序对象。这似乎有效,但我发现 EditText 字段也接受了放置操作。我不希望发生这种情况。
首先,我定义了这样的客户 MIME 类型:
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 小部件时,它会将“未使用”插入到文本区域中。我怎样才能防止这种情况发生? 谢谢。
最佳答案
我遇到了同样的行为。我找到了原因,它位于 TextView 类中。
方法 onDragEvent(DragEvent event) 在这里被覆盖,如下所示。
@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);
这里的解决方案是像这里一样继承 EditText 并覆盖 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;
}
就是这样。 希望对您有所帮助。
关于android - 防止将自定义 mimetype 拖放到 EditText,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12041523/