Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 防止将自定义mimetype拖放到EditText_Android_Drag And Drop_Android Edittext_Mime Types - Fatal编程技术网

Android 防止将自定义mimetype拖放到EditText

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 //-------------------------------

我有一个自定义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小部件时,它会将“未使用”插入文本区域。我怎样才能防止这种情况?
谢谢。

我遇到了一个类似的问题,因为我不希望布局接受删除操作

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