android - 防止将自定义 mimetype 拖放到 EditText

标签 android drag-and-drop android-edittext mime-types

我有一个自定义 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/

相关文章:

android - 我可以将 Android View 覆盖在 libgdx GL 表面之上吗?

java - 如何从 firebase 实时数据库检索数据并将其显示在个人资料仪表板中

java - Android Studio 中的增强现实

android - onDataChanged 监听器未检测到数据传输(Data Api)

java - 拖放 Netbeans 按钮是否隐藏?

android - 带有两个 editText 的 float 标签

objective-c - 不带 "file://"的拖放 NSURL

javascript - 使用 HTML5 拖放,有没有办法在保持拖动流的同时从 View 中隐藏元素

android - 如何在 TextInputLayout 上设置 maxHeight

android EditText,键盘textWatcher问题