DropHelper upraszczający przeciąganie i upuszczanie

Klasa DropHelper upraszcza ten proces. wdrożenia funkcji „przeciągnij i upuść”. Członek jetpacka Biblioteka DragAndDrop, DropHelper zapewnia zgodność wsteczną do poziomu interfejsu API 24.

Użyj DropHelper, aby określić cele pomijania, dostosować wyróżnienie elementu docelowego i określić sposób postępowania z porzuconymi danymi.

Ustaw źródło przeciągania

Na początek utwórz DragStartHelper z przeciąganiem widoku źródła OnDragStartListener

W OnDragStartListener metody zastępowania onDragStart(). Tworzenie obiektu ClipData i ClipData.Item dla przenoszonych danych. W ramach ClipData, dostarczania metadanych przechowywanych w obiekcie ClipDescription w ClipData W przypadku operacji „przeciągnij i upuść”, która nie odzwierciedla przenoszenia danych, możesz użyć obiektu null zamiast rzeczywistego obiektu.

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

Określ wartości docelowe pomijania

Gdy użytkownik zwolni cień na widok, trzeba skonfigurować ten widok akceptacja tych danych i właściwe udzielenie odpowiedzi.

DropHelper.configureView() to statyczna, przeciążona metoda, która umożliwia To obejmują następujące parametry:

Aby na przykład utworzyć grupę docelową, która akceptuje obrazy, użyj jednej z następujące wywołania metod:

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

W drugim wywołaniu pomijane są opcje konfiguracji miejsca docelowego pomijania. W takim przypadku kolor wyróżnienia w miejscu docelowym jest ustawiony na dodatkowy (lub uzupełniający) kolor motywu, promień narożnika wyróżnienia jest ustawiony na 16 dp, a lista EditText Komponenty są puste. Więcej informacji znajdziesz w następnej sekcji.

Skonfiguruj cele pomijania

DropHelper.Options wewnętrzna klasa umożliwia skonfigurowanie celów pomijania danych. Podaj instancję klasy do: DropHelper.configureView(Activity, View, String[], Options, OnReceiveContentListener) . Więcej informacji znajdziesz w poprzedniej sekcji.

Dostosuj wyróżnienie miejsca docelowego

DropHelper konfiguruje elementy docelowe tak, aby były wyświetlane podświetlenie podczas przeciągania przez użytkownika nad treścią docelową. DropHelper udostępnia styl domyślny, DropHelper.Options pozwala ustawić kolor zaznaczenia i określić promień narożnika prostokąta zaznaczenia.

Użyj DropHelper.Options.Builder do utworzenia instancji DropHelper.Options i ustawienia opcji konfiguracyjnych, jak w tym przykładzie:

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

Obsługa komponentów EditText w elementach docelowych

DropHelper kontroluje też fokus w obrębie elementu docelowego, gdy cel zawiera: edytowalne pola tekstowe.

Celami pomijania mogą być pojedynczy widok lub hierarchia widoków. Jeśli hierarchia zawiera co najmniej jeden element typu EditText należy podać listę komponentów, które mają DropHelper.Options.Builder.addInnerEditTexts(EditText...) , by zapewnić prawidłowe działanie wyróżniania elementów docelowych i obsługi danych tekstowych.

DropHelper uniemożliwia EditText komponentów w widoku danych docelowych przed odciąganiem uwagi od widoku, który zawiera, podczas interakcji z przeciąganiem.

Oprócz tego, jeśli funkcja przeciągnij i upuść ClipData zawiera tekst i dane URI, DropHelper wybiera jedną z opcji EditText w obszarze docelowym do obsługi danych tekstowych. Wybór zależy od w tej kolejności:

  1. Pole EditText, w którym odrzucono wartość ClipData.
  2. Element EditText zawierający kursor tekstowy (daszek).
  3. Pierwsze EditText przesłane do wywołania DropHelper.Options.Builder.addInnerEditTexts(EditText...)

Aby ustawić EditText jako domyślny moduł obsługi danych tekstowych, przekaż EditText jako pierwszy argument wywołania do DropHelper.Options.Builder.addInnerEditTexts(EditText...) Na przykład, jeśli element docelowy obsługuje obrazy, ale zawiera edytowalne pola tekstowe T1, T2, i T3, ustaw T2 jako domyślną w ten sposób:

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

Obsługuj dane w elementach docelowych

Metoda DropHelper.configureView() akceptuje OnReceiveContentListener utworzonego na potrzeby przeciągania i upuszczania ClipData. Dane „przeciągnij i upuść” jest przekazywana detektorowi w ContentInfoCompat. Obiekt zawiera dane tekstowe. Multimedia, takie jak obrazy, są reprezentowane przez Identyfikatory URI.

OnReceiveContentListener obsługuje też dane przekazywane do miejsca docelowego przez interakcje użytkowników inne niż przeciąganie i upuszczanie, na przykład kopiowanie i wklej – gdy DropHelper.configureView() jest używany do skonfigurowania typy wyświetleń:

  • Wszystkie widoki, jeśli użytkownik ma Androida w wersji 12 lub nowszej.
  • AppCompatEditText jeśli użytkownik ma Androida w wersji starszej niż 7.0.
.

Typy MIME, uprawnienia i weryfikacja treści

Sprawdzanie typu MIME przez DropHelper odbywa się metodą „przeciągnij i upuść” ClipDescription, czyli utworzone przez aplikację udostępniającą dane metodą „przeciągnij i upuść”. Zweryfikuj parametr ClipDescription, aby upewnić się, że typy MIME są prawidłowo skonfigurowane.

DropHelper prosi o wszystkie uprawnienia dostępu do identyfikatorów URI treści zawartych w przeciągnij i upuść ClipData. Więcej informacji: DragAndDropPermissions pozwalają na obsługę identyfikatorów URI treści podczas przetwarzania i skalowalnych danych.

DropHelper nie weryfikuje danych zwracanych przez dostawców treści, gdy: rozpoznawania identyfikatorów URI z usuniętych danych. Sprawdź wartość null i zweryfikuj poprawność wszystkich rozwiązanych danych.