防止自定义MIME类型的拖放到的EditText(Prevent drag drop of cust

2019-07-31 02:36发布

我有我打算使用的应用程序中拖放应用程序对象的自定义MIME类型。 这似乎是工作,但我发现了的EditText字段也接受拖放操作。 我不希望这种事情发生。

首先,我已经定义了custome 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小部件“下降”,将其插入“未使用”到文本区域。 我怎样才能避免这种情况? 谢谢。

Answer 1:

我遇到了同样的行为。 我已经找到了原因,它位于TextView的类。

该方法onDragEvent(的dragEvent事件)这里overrriden和下面看。

@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拖累。 如果你想在所有禁用拖放就在这个method`返回false

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

仅此而已。 希望这将有助于。



Answer 2:

我遇到了在我不想布局接受拖放操作类似的问题。

通过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
    }


Answer 3:

你可以写

edit.setEnabled(false);
edit.setFocusable(false);

刚过调用startDrag()并恢复原值为特定editText刚过控制DragEvent.ACTION_DRAG_ENDED

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



Answer 4:

如果拖动事件已成功处理,或假,如果拖曳事件没有处理,则返回true。 需要注意的是假将触发查看调用它onDragEvent()处理。

这是ondrag当从的文档(视图V,的dragEvent事件)语句。 所以,如果你返回false则该事件由EditText上的onDragEvent()来处理。 因此最简单的解决方案是:

editText.setOnDragListener(new OnDragListener() {

        @Override
        public boolean onDrag(View v, DragEvent event) {
            return true;
        }
    });

如果你想执行某些功能,指定基于拖拽事件,他们将被执行。



文章来源: Prevent drag drop of custom mimetype to EditText