Per*_*man 10 android drag-and-drop mime-types android-edittext
我有一个自定义mime类型,我打算用它来拖放应用程序中的应用程序对象.这似乎工作,但我发现EditText字段也接受放置操作.我不希望这种情况发生.
首先,我已经定义了如下的custome mime类型:
public static final String MIME_TYPE_MYNODE = "com.example.mockup/mynode";
Run Code Online (Sandbox Code Playgroud)
然后,在源对象的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;
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
当我"删除"EditText小部件时,它会在文本区域中插入"unused".我怎么能阻止这个?谢谢.
我遇到了同样的行为.我找到了原因,它位于TextView类中.
onDragEvent(DragEvent事件)方法在这里被覆盖,如下所示.
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果可以插入text => EditText,那么将在那里处理和接受任何拖动.View类未使用OnDragListener,因此无法阻止此行为
editText.setOnDragListener(null);
Run Code Online (Sandbox Code Playgroud)
这里的解决方案是将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);
}
}
Run Code Online (Sandbox Code Playgroud)
}
现在,YourEditText将只接受带有MIMETYPE_TEXT_PLAIN的拖动.如果要完全禁用拖放,只需在此方法中返回false
@Override
public boolean onDragEvent(DragEvent event) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
就是这样.希望它会有所帮助.
我遇到了类似的问题,因为我不希望布局接受放置操作。
通过 setOnDragListener 将拖动侦听器附加到编辑字段。
edtText.setOnDragListener(new MyDragListener());
Run Code Online (Sandbox Code Playgroud)
检查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
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2403 次 |
最近记录: |