DropHelper für vereinfachtes Drag-and-drop

Mit der Klasse DropHelper wird die Implementierung von Drag-and-drop-Funktionen. Ein Mitglied des Jetpacks DragAndDrop-Bibliothek, DropHelper bietet Abwärtskompatibilität bis hin zum API-Level 24.

Verwenden Sie DropHelper, um Drop-Ziele anzugeben, das Hervorheben von Drop-Zielen anzupassen, und definieren, wie mit gelöschten Daten umgegangen wird.

Drag-Quelle festlegen

Erstellen Sie zuerst DragStartHelper Quellansicht ziehen und OnDragStartListener

In OnDragStartListener: Überschreibungsmethode onDragStart(). ClipData-Objekt erstellen und ClipData.Item für die zu verschiebenden Daten. Im Rahmen der ClipData Metadaten bereitstellen, die in einem ClipDescription-Objekt innerhalb der ClipData Bei einem Drag-and-drop-Vorgang, der keine Datenbewegung darstellt, sollten Sie anstelle eines tatsächlichen Objekts null verwenden.

Kotlin

DragStartHelper(draggableView)
    { view: View, _: DragStartHelper ->
        val item = ClipData.Item(view.tag as? CharSequence)
        val dragData = ClipData(
            view.tag as? CharSequence,
            arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN),
            item
        )
        view.startDragAndDrop(
            dragData,
            View.DragShadowBuilder(view),
            null,
            0
        )
    }.attach()

Java

new DragStartHelper(draggableView, new DragStartHelper.OnDragStartListener() {
    @Override
    public void onDragStart(View view, DragStartHelper helper) {
        CharSequence tag = (CharSequence) view.getTag();
        ClipData.Item item = new ClipData.Item(tag);
        ClipData dragData = new ClipData(
          tag, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
        view.startDragAndDrop(
          dragData, new View.DragShadowBuilder(view), null, 0);
    }
});

Drop-Ziele angeben

Wenn ein Nutzer einen Schlagschatten über einer Ansicht loslässt, muss die Ansicht konfiguriert werden um die Daten zu akzeptieren und korrekt zu antworten.

DropHelper.configureView() ist eine statische, überladene Methode, mit der Sie Drop-Ziele angeben können. Das -Parameter umfassen Folgendes:

Um beispielsweise ein Drop-Ziel zu erstellen, das Bilder akzeptiert, verwenden Sie eines der Methodenaufrufe verwenden:

Kotlin

configureView(
    myActivity,
    targetView,
    arrayOf("image/*"),
    options,
    onReceiveContentListener)

// or

configureView(
    myActivity,
    targetView,
    arrayOf("image/*"),
    onReceiveContentListener)

Java

DropHelper.configureView(
    myActivity,
    targetView,
    new String[] {"image/*"},
    options,
    onReceiveContentlistener);

// or

DropHelper.configureView(
    myActivity,
    targetView,
    new String[] {"image/*"},
    onReceiveContentlistener);

Beim zweiten Aufruf werden die Konfigurationsoptionen für das Drop-Ziel weggelassen. In diesem Fall Zielhervorhebungsfarbe wird auf die sekundäre (oder Akzentfarbe) des Designs festgelegt, der Eckenradius der Hervorhebung auf 16 dp festgelegt ist und die Liste der EditText ist leer. Weitere Informationen finden Sie im folgenden Abschnitt.

Drop-Ziele konfigurieren

Die DropHelper.Options Mit der inneren Klasse können Sie Drop-Ziele konfigurieren. Geben Sie eine Instanz der Klasse an, DropHelper.configureView(Activity, View, String[], Options, OnReceiveContentListener) . Weitere Informationen finden Sie im vorherigen Abschnitt.

Hervorhebung von Drop-Zielen anpassen

DropHelper konfiguriert Drop-Ziele so, dass beim Ziehen der Nutzer eine Markierung angezeigt wird die Inhalte über den Zielen liegt. DropHelper bietet einen Standardstil und Mit DropHelper.Options können Sie die Farbe der Markierung festlegen Eckenradius des Rechtecks der Markierung.

Verwenden Sie die Methode DropHelper.Options.Builder um eine DropHelper.Options-Instanz zu erstellen und Konfigurationsoptionen festzulegen. Dies wird im folgenden Beispiel gezeigt:

Kotlin

val options: DropHelper.Options = DropHelper.Options.Builder()
                                      .setHighlightColor(getColor(R.color.purple_300))
                                      .setHighlightCornerRadiusPx(resources.getDimensionPixelSize(R.dimen.drop_target_corner_radius))
                                      .build()

Java

DropHelper.Options options = new DropHelper.Options.Builder()
                                     .setHighlightColor(getColor(R.color.purple_300))
                                     .setHighlightCornerRadiusPx(getResources().getDimensionPixelSize(R.dimen.drop_target_corner_radius))
                                     .build();

EditText-Komponenten in Drop-Zielen verarbeiten

DropHelper steuert auch den Fokus innerhalb des Drop-Ziels, wenn das Ziel enthält Textfelder bearbeiten können.

Drop-Ziele können eine einzelne Ansicht oder eine Ansichtshierarchie sein. Wenn die Zielansicht Hierarchie enthält mindestens ein EditText Komponenten, geben Sie eine Liste der Komponenten an, DropHelper.Options.Builder.addInnerEditTexts(EditText...) um sicherzustellen, dass das Hervorheben von Drop-Zielen und die Verarbeitung von Textdaten korrekt funktionieren.

DropHelper verhindert, dass EditText-Komponenten in der Ansicht für das abgelegte Ziel entfernt werden. Hierarchie, den Fokus bei Interaktionen per Drag-and-drop nicht aus der übergeordneten Ansicht zu entfernen.

Wenn die Drag-and-drop-Funktion ClipData Text- und URI-Daten enthält, wählt DropHelper eine der EditText aus. Komponenten im Drop-Ziel zur Verarbeitung der Textdaten verwendet werden. Die Auswahl basiert auf der in folgender Reihenfolge:

  1. Die EditText, auf der das ClipData gelöscht wird.
  2. Die EditText, die den Textcursor (Caret-Zeichen) enthält.
  3. Die erste EditText, die für den Aufruf von bereitgestellt wird DropHelper.Options.Builder.addInnerEditTexts(EditText...).

Um ein EditText als Standard-Textdaten-Handler festzulegen, übergeben Sie das EditText als das erste Argument des Aufrufs DropHelper.Options.Builder.addInnerEditTexts(EditText...). Wenn beispielsweise Das Ablageziel verarbeitet Bilder, enthält aber bearbeitbare Textfelder T1, T2, und T3, legen Sie T2 so als Standard fest:

Kotlin

val options: DropHelper.Options = DropHelper.Options.Builder()
                                      .addInnerEditTexts(T2, T1, T3)
                                      .build()

Java

DropHelper.Options options = new DropHelper.Options.Builder()
                                     .addInnerEditTexts(T2, T1, T3)
                                     .build();

Daten in Drop-Zielen verarbeiten

Die Methode DropHelper.configureView() akzeptiert OnReceiveContentListener. die Sie für die Drag-and-drop-Funktion ClipData erstellen. Die Drag-and-drop-Daten wird dem Listener in einer ContentInfoCompat-Objekt. Im Objekt sind Textdaten vorhanden. Medien wie Bilder werden durch URIs.

OnReceiveContentListener verarbeitet auch Daten, die dem Drop-Ziel zur Verfügung gestellt werden, Nutzerinteraktionen, die über Drag-and-drop hinausgehen, wie einfügen: Wenn mit DropHelper.configureView() Folgendes konfiguriert wird: Arten von Ansichten:

  • Alle Ansichten, wenn der Nutzer Android 12 oder höher verwendet.
  • AppCompatEditText, Der Nutzer verwendet eine Android-Version bis Android 7.0.

MIME-Typen, Berechtigungen und Inhaltsvalidierung

Die MIME-Typ-Überprüfung durch DropHelper basiert auf Drag-and-drop ClipDescription: die von der App mit den Drag-and-drop-Daten erstellt wurden. Validieren Sie die ClipDescription, um sicherzugehen, dass die MIME-Typen korrekt festgelegt sind.

DropHelper fordert alle Zugriffsberechtigungen für Inhalts-URIs an, die in der ClipData per Drag-and-drop hinzufügen. Weitere Informationen finden Sie unter DragAndDropPermissions Die Mit Berechtigungen können Sie die Inhalts-URIs beim Verarbeiten von Drag-and-drop- Daten.

DropHelper validiert die von Contentanbietern zurückgegebenen Daten nicht, wenn die URIs in den verworfenen Daten auflösen. Prüfen Sie auf null und verifizieren Sie die Richtigkeit von aufgelösten Daten.