I have a custom mime type which I am intending to use to drag and drop application objects within the app. This seems to be working but I'm finding that the EditText fields are also accepting the drop action. I don't want this to happen.
First, I've defined the custome mime type like this:
public static final String MIME_TYPE_MYNODE = "com.example.mockup/mynode";
Then, in the onTouch handler for the source object I have:
@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;
}
}
...
}
When I "drop" on an EditText widget, it inserts "unused" into the text area. How can I prevent this? Thanks.
You may write
just after calling
startDrag()
, and restore old values for that particulareditText
control just afterDragEvent.ACTION_DRAG_ENDED
.But, honestly, this is quite dirty approach.
I encountered the same behaviour. I have found the reason, which is located in TextView class.
The method onDragEvent(DragEvent event) is overrriden here and looks as below.
If it is possible to insert text => EditText then any drag will be processed and accepted there. The View class is not using OnDragListener, so it is not possible to prevent this behaviour by
The solution here is to subclass the EditText as here and override onDragEvent() method:
}
Now YourEditText will accept only drags with MIMETYPE_TEXT_PLAIN. If you want to disable the drag drop at all just return false in this method`
And that's it. Hope it will help.
This is statement from the docs of onDrag(View v, DragEvent event). So if you return false then the event is handled by onDragEvent() of EditText. Hence the simplest solutions is:
In case you would like to perform some functions, specify based on the Drag event and they will be executed.
I encountered a similar issue in that I did not want a layout to accept the drop action.
Attach a drag listener to your edit field via the setOnDragListener.
Check whether the target view in the onDrag event is your edit text.