我有我打算使用的应用程序中拖放应用程序对象的自定义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小部件“下降”,将其插入“未使用”到文本区域。 我怎样才能避免这种情况? 谢谢。
我遇到了同样的行为。 我已经找到了原因,它位于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;
}
仅此而已。 希望这将有助于。
我遇到了在我不想布局接受拖放操作类似的问题。
通过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()
并恢复原值为特定editText
刚过控制DragEvent.ACTION_DRAG_ENDED
。
但是,说实话,这是很肮脏的做法。
如果拖动事件已成功处理,或假,如果拖曳事件没有处理,则返回true。 需要注意的是假将触发查看调用它onDragEvent()处理。
这是ondrag当从的文档(视图V,的dragEvent事件)语句。 所以,如果你返回false则该事件由EditText上的onDragEvent()来处理。 因此最简单的解决方案是:
editText.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View v, DragEvent event) {
return true;
}
});
如果你想执行某些功能,指定基于拖拽事件,他们将被执行。