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:
- El
Activity
actual, que se usa para URI permisos.- Un objeto
View
que funciona como destino para soltar- Los tipos de MIME que el destino para soltar puede aceptar de los datos descartados.
- Un objeto
- Opciones de configuración para el destino para soltar (en particular, una lista de
campos
EditText
incorporados. - Un objeto
OnReceiveContentListener
para manejar los datos descartados.
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:
- El
EditText
en el que se descartaClipData
. - El
EditText
que contiene el cursor de texto (signo de intercalación). - El primer
EditText
proporcionado a la llamada aDropHelper.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.