Vermeidung von Drag Drop von benutzerdefinierten Mimetype zu EditText

Ich habe eine benutzerdefinierte Mime-Typ, die ich beabsichtige zu verwenden, um Drag & Drop Anwendungsobjekte in der App. Dies scheint zu funktionieren, aber ich finde, dass die EditText-Felder auch die Drop-Aktion akzeptieren. Ich will das nicht.

Zuerst habe ich den Custome Mime Typ so definiert:

public static final String MIME_TYPE_MYNODE = "com.example.mockup/mynode"; 

Dann habe ich im onTouch-Handler für das Quellobjekt:

  @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; } } ... } 

Wenn ich auf einem EditText-Widget "fallen", fügt es "unbenutzt" in den Textbereich ein. Wie kann ich das verhindern? Vielen Dank.

  • Wie lautet das mimeType-Attribut in <data>?
  • Java MimetypesFileTypeMap immer wieder Anwendung / Octet-Stream auf Android Emulator
  • Wie kann ich den Mime-Typ einer Datei mit seinem Uri bekommen?
  • Android - MIME-Typ aus Datei ohne Erweiterung
  • Web-Host-Ausgabe, .apk-Dateien zum Download von Android-Browser
  • Mehrere MIME-Typen in Android
  • Wie fügt man benutzerdefinierten Mime-Typ?
  • Android: Lassen Sie Benutzer Bild oder Video aus der Galerie auswählen
  • 4 Solutions collect form web for “Vermeidung von Drag Drop von benutzerdefinierten Mimetype zu EditText”

    Ich traf das gleiche Verhalten. Ich habe den Grund gefunden, der sich in der TextView-Klasse befindet.

    Die Methode onDragEvent (DragEvent-Ereignis) ist hier überschritten und sieht wie folgt aus.

     @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; } } 

    Wenn es möglich ist, text => EditText einzufügen, dann wird jeder Zug verarbeitet und akzeptiert. Die View-Klasse verwendet OnDragListener nicht, so dass es nicht möglich ist, dieses Verhalten zu verhindern

     editText.setOnDragListener(null); 

    Die Lösung hier ist, um die EditText wie hier zu unterklassen und onDragEvent () Methode zu überschreiben:

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

    }

    Jetzt wird IhrEditText nur mit MIMETYPE_TEXT_PLAIN ziehen. Wenn du den Drag-Drop deaktivieren willst, kannst du einfach false in dieser Methode zurückgeben

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

    Und das ist es. Hoffe, es wird helfen.

    Ich traf ein ähnliches Problem, dass ich nicht wollte ein Layout, um die Drop-Aktion zu akzeptieren.

    Bringen Sie einen Drag-Listener zu Ihrem Bearbeitungsfeld über den setOnDragListener.

     edtText.setOnDragListener(new MyDragListener()); 

    Prüfen Sie, ob die Zielansicht im onDrag-Ereignis Ihr Bearbeitungstext ist.

     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 } 

    Sie können schreiben

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

    Kurz nach dem Aufruf von startDrag() und Wiederherstellung alter Werte für das jeweilige editText Steuerelement direkt nach DragEvent.ACTION_DRAG_ENDED .

    Aber ehrlich gesagt, das ist ziemlich schmutzig.

    Gibt true zurück, wenn das Drag-Event erfolgreich behandelt wurde, oder false, wenn das Drag-Event nicht behandelt wurde. Beachten Sie, dass false die Ansicht auslöst, um seinen onDragEvent () – Handler aufzurufen.

    Dies ist eine Aussage aus den docs von onDrag (View v, DragEvent-Ereignis). Also, wenn Sie falsch zurückgeben, dann wird das Ereignis von onDragEvent () von EditText behandelt. Die einfachsten Lösungen sind also:

     editText.setOnDragListener(new OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { return true; } }); 

    Falls Sie einige Funktionen ausführen möchten, geben Sie basierend auf dem Drag-Ereignis an und werden ausgeführt.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.