DropHelper para simplificar la acción de arrastrar y soltar

La clase DropHelper simplifica la implementación de la función de arrastrar y soltar. Un miembro de la biblioteca DragAndDrop de Jetpack, DropHelper, proporciona retrocompatibilidad hasta el nivel de API 24.

Usa DropHelper para especificar destinos para soltar, personalizar el resaltado de objetivos de soltar y definir cómo se controlan los datos descartados.

Establecer fuente de arrastre

Para comenzar, crea DragStartHelper con la vista de arrastrar fuente y OnDragStartListener

En OnDragStartListener, método de anulación onDragStart(). Crea un objeto ClipData y un objeto ClipData.Item para los datos que se están moviendo. Como parte de ClipData, los metadatos que se almacenan en un objeto ClipDescription dentro del ClipData Para una operación de arrastrar y soltar que no representa movimiento de datos, Te recomendamos que uses null en lugar de un objeto real.

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

Cómo especificar destinos para soltar

Cuando un usuario suelta una sombra paralela sobre una vista, esta debe configurarse de forma adecuada para aceptar los datos y responder de forma correcta.

DropHelper.configureView() es un método estático y de sobrecarga que te permite especificar destinos para soltar. Es incluyen lo siguiente:

Por ejemplo, a fin de crear un destino para soltar que acepte imágenes, usa cualquiera de las siguientes llamadas a métodos:

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

La segunda llamada omite las opciones de configuración del destino para soltar, en cuyo caso, el color de resaltado del destino para soltar se establece en el color secundario (o de acento) del tema. el radio de la esquina destacada se estableció en 16 dp y la lista de EditText componentes esté vacío. Consulta la siguiente sección para obtener más detalles.

Configura destinos para soltar

La DropHelper.Options la clase interna te permite configurar destinos para soltar. Proporciona una instancia de la clase para el DropHelper.configureView(Activity, View, String[], Options, OnReceiveContentListener) . Consulta la sección anterior para obtener más información.

Personalizar el resaltado de objetivos para soltar

DropHelper configura los destinos para soltar de manera que muestren una selección a medida que los usuarios arrastran contenido sobre los destinos. DropHelper proporciona un estilo predeterminado. DropHelper.Options te permite establecer el color del resaltado y especificar la radio de esquina del rectángulo del elemento destacado.

Usa el DropHelper.Options.Builder para crear una instancia de DropHelper.Options y establecer las opciones de configuración, como se muestra en el siguiente ejemplo:

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

Cómo controlar los componentes EditText en los destinos para soltar

DropHelper también controla el enfoque dentro del destino para soltar cuando este contiene campos de texto editables.

Los destinos para soltar pueden ser una sola vista o una jerarquía de vistas. Si la vista del destino para soltar la jerarquía contiene uno o más EditText proporciona una lista de los componentes DropHelper.Options.Builder.addInnerEditTexts(EditText...) para asegurarse de que el resaltado de objetivos de soltar y el manejo de datos de texto funcionen correctamente.

DropHelper evita componentes EditText en la vista del destino para soltar. que la jerarquía robe el enfoque de la vista contenedora durante las interacciones de arrastre.

Además, si el botón de arrastrar y soltar ClipData incluye texto y datos de URI, DropHelper selecciona uno de los EditText en el destino para soltar a fin de controlar los datos de texto. La selección se basa en el siguiente orden de prioridad:

  1. El EditText en el que se descarta ClipData.
  2. El EditText que contiene el cursor de texto (signo de intercalación).
  3. El primer EditText proporcionado a la llamada a DropHelper.Options.Builder.addInnerEditTexts(EditText...)

Para establecer un elemento EditText como el controlador de datos de texto predeterminado, pasa EditText como el primer argumento de la llamada a DropHelper.Options.Builder.addInnerEditTexts(EditText...). Por ejemplo, si tu objetivo de soltar controla las imágenes, pero contiene campos de texto editables T1, T2 y T3, haz que T2 sea el valor predeterminado de la siguiente manera:

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

Cómo controlar datos en destinos para soltar

El método DropHelper.configureView() acepta un OnReceiveContentListener que crees para controlar el elemento ClipData de arrastrar y soltar. Los datos de arrastrar y soltar se proporciona al objeto de escucha en un Objeto ContentInfoCompat. Los datos de texto están presentes en el objeto. El contenido multimedia, como las imágenes, se representa con URIs.

El elemento OnReceiveContentListener también controla los datos que se proporcionan al destino para soltar las interacciones del usuario distintas de arrastrar y soltar, como copiar y pegar, cuando DropHelper.configureView() se usa para configurar los siguientes tipos de vistas:

  • Todas las vistas, si el usuario ejecuta Android 12 o una versión posterior
  • AppCompatEditText: si el usuario ejecuta una versión de Android anterior a Android 7.0.

Tipos de MIME, permisos y validación de contenido

La comprobación del tipo de MIME que realiza DropHelper se basa en la acción de arrastrar y soltar. ClipDescription, que es creados por la app que proporcionan los datos de arrastrar y soltar. Valida el ClipDescription para garantizar que los tipos de MIME estén configurados correctamente.

DropHelper solicita todos los permisos de acceso para los URI de contenido incluidos en arrastra y suelta ClipData. Para obtener más información, consulta DragAndDropPermissions El los permisos te permiten resolver los URI de contenido cuando procesas la acción de arrastrar y soltar de datos no estructurados.

DropHelper no valida los datos que muestran los proveedores de contenido cuando resolver los URIs en los datos descartados. Comprobar la nulabilidad y verificar la precisión de cualquier dato resuelto.