DropHelper pour un glisser-déposer simplifié

La classe DropHelper simplifie la mise en œuvre de fonctions de glisser-déposer. Un membre du Jetpack Bibliothèque DragAndDrop, DropHelper et assure la rétrocompatibilité jusqu'au niveau d'API 24.

Utilisez DropHelper pour spécifier des cibles de dépôt, personnaliser la mise en surbrillance des cibles de dépôt, et définir la façon dont les données supprimées sont traitées.

Définir la source du déplacement

Pour commencer, créez DragStartHelper faites glisser la vue source et OnDragStartListener

Dans OnDragStartListener, méthode de remplacement onDragStart(). Créer un objet ClipData et ClipData.Item pour les données déplacées. Dans le cadre du ClipData, fournissent des métadonnées stockées dans un objet ClipDescription au sein de ClipData Pour une opération de glisser-déposer qui ne représente pas le déplacement des données, vous pouvez utiliser null au lieu d'un objet réel.

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

Spécifier des cibles de dépôt

Lorsqu'un utilisateur libère une ombre projetée sur une vue, celle-ci doit être configurée correctement pour accepter les données et répondre correctement.

DropHelper.configureView() est une méthode statique et surchargée qui vous permet de spécifier des cibles de dépôt. Son sont les suivants:

Par exemple, pour créer une cible de dépôt qui accepte les images, utilisez l'une des les appels de méthode suivants:

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

Le deuxième appel omet les options de configuration de la cible de dépôt, auquel cas le la couleur de mise en surbrillance de la cible de dépôt est définie sur la couleur secondaire (ou d'accentuation) du thème ; le rayon de l'angle mis en surbrillance est défini sur 16 dp, et la liste de EditText est vide. Pour en savoir plus, consultez la section suivante.

Configurer les cibles de dépôt

DropHelper.Options interne vous permet de configurer des cibles de dépôt. Fournissez une instance de la classe à le DropHelper.configureView(Activity, View, String[], Options, OnReceiveContentListener) . Pour en savoir plus, consultez la section précédente.

Personnaliser la mise en surbrillance de la cible de dépôt

DropHelper configure les cibles de dépôt pour qu'elles s'affichent en surbrillance pendant que les utilisateurs font glisser le contenu sur les cibles. DropHelper fournit un style par défaut ; et DropHelper.Options vous permet de définir la couleur de la mise en surbrillance et de spécifier la et l'arrondi d'angle du rectangle de la mise en surbrillance.

Utilisez les DropHelper.Options.Builder pour créer une instance DropHelper.Options et définir les options de configuration, comme illustré dans l'exemple suivant:

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

Gérer les composants EditText dans les cibles de dépôt

DropHelper contrôle également le focus dans la cible de dépôt lorsque celle-ci contient des champs de texte modifiables.

Les cibles de dépôt peuvent être une vue unique ou une hiérarchie de vues. Si la vue cible de la suppression la hiérarchie contient une ou plusieurs EditText des composants, fournissez une liste des composants DropHelper.Options.Builder.addInnerEditTexts(EditText...) pour s'assurer que la mise en surbrillance de la cible de dépôt et la gestion des données textuelles fonctionnent correctement.

DropHelper empêche les composants EditText dans la vue de la cible de dépôt de la vue parent au cours des interactions de déplacement.

De plus, si la fonction glisser-déposer ClipData inclut du texte et des données d'URI, DropHelper sélectionne l'une des EditText dans la cible de dépôt pour traiter les données textuelles. La sélection est basée sur ordre de priorité suivant:

  1. EditText sur lequel le ClipData est abandonné.
  2. EditText contenant le curseur de texte (signe d'insertion).
  3. Le premier EditText fourni à l'appel de DropHelper.Options.Builder.addInnerEditTexts(EditText...)

Pour définir EditText comme gestionnaire de données textuelles par défaut, transmettez EditText en tant que le premier argument de l'appel DropHelper.Options.Builder.addInnerEditTexts(EditText...) Par exemple, si votre cible de dépôt gère les images, mais contient des champs de texte modifiables (T1, T2, et T3, définissez T2 comme valeur par défaut, comme suit:

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

Gérer les données dans les cibles de dépôt

La méthode DropHelper.configureView() accepte un OnReceiveContentListener. que vous créez pour gérer l'ClipData de glisser-déposer. Le glisser-déposer des données est fournie à l'écouteur dans objet ContentInfoCompat. L'objet contient des données textuelles. Les supports, tels que les images, sont représentés par URI.

OnReceiveContentListener gère également les données fournies à la cible de dépôt par les interactions utilisateur autres que le glisser-déposer, comme les opérations de copie et coller : lorsque DropHelper.configureView() est utilisé pour configurer les éléments suivants types de vues:

  • Toutes les vues, si l'utilisateur est équipé d'Android 12 ou version ultérieure.
  • AppCompatEditText, si l'utilisateur exécute une version d'Android antérieure à Android 7.0.

Types MIME, autorisations et validation du contenu

La vérification du type MIME par DropHelper est basée sur le glisser-déposer ClipDescription, qui est créé par l'application qui fournit les données de glisser-déposer. Validez le ClipDescription pour vous assurer que les types MIME sont correctement définis.

DropHelper demande toutes les autorisations d'accès pour les URI de contenu contenus dans le glisser-déposer ClipData. Pour en savoir plus, consultez DragAndDropPermissions La vous permettent de résoudre les URI de contenu lors du traitement du glisser-déposer données.

DropHelper ne valide pas les données renvoyées par les fournisseurs de contenu lorsque résoudre les URI dans les données supprimées. Recherchez les valeurs nulles et vérifiez l’exactitude de toutes les données résolues.