DropHelper para operação de arrastar e soltar simplificada

A classe DropHelper simplifica implementação de recursos de arrastar e soltar. Um membro da biblioteca DragAndDrop do Jetpack, o DropHelper, oferece compatibilidade com versões anteriores até o nível 24 da API.

Use o DropHelper para especificar destinos de soltar, personalizar o destaque do destino de soltar e definir como os dados descartados são processados.

Definir origem da ação de arrastar

Para começar, crie DragStartHelper com a visualização de origem arraste e OnDragStartListener

No OnDragStartListener, substituir o método onDragStart(). Criar um objeto ClipData e ClipData.Item para os dados que estão sendo movidos. Como parte do ClipData, fornecem metadados armazenados em um objeto ClipDescription dentro do ClipData: Para uma operação de arrastar e soltar que não representa movimento de dados, use null em vez de um 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);
    }
});

Especificar destinos para soltar

Quando um usuário solta uma sombra projetada sobre uma visualização, ela precisa ser configurada para aceitar os dados e responder corretamente.

DropHelper.configureView() é um método estático e sobrecarregado que permite especificar destinos de soltar. Seu incluem o seguinte:

Por exemplo, para criar um destino de soltar que aceite imagens, use uma das chamadas de método abaixo:

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

A segunda chamada omite as opções de configuração do destino de soltar. Nesse caso, o a cor de destaque do destino de soltar é definida como a cor secundária (ou de destaque) do tema; o raio do canto de destaque está definido como 16 dp, e a lista de EditText está vazio. Consulte a próxima seção para mais informações.

Configurar destinos de soltar

O DropHelper.Options interna permite configurar destinos de soltar. Forneça uma instância da classe para DropHelper.configureView(Activity, View, String[], Options, OnReceiveContentListener) . Consulte a seção anterior para saber mais.

Personalizar o destaque do destino de soltar

O DropHelper configura destinos de soltar para exibir um destaque enquanto os usuários arrastam o conteúdo sobre os destinos. DropHelper fornece o estilo padrão. DropHelper.Options permite definir a cor do destaque e especificar a raio do canto do retângulo do destaque.

Use o DropHelper.Options.Builder para criar uma instância DropHelper.Options e definir opções de configuração. conforme mostrado neste exemplo:

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

Processar componentes EditText em destinos de soltar

O DropHelper também controla o foco no destino de soltar quando o destino contém campos de texto editáveis.

Os destinos de soltar podem ser uma visualização única ou uma hierarquia de visualização. Se a visualização do destino de soltar hierarquia contém um ou mais EditText componentes, forneça uma lista dos componentes a DropHelper.Options.Builder.addInnerEditTexts(EditText...) para garantir que o destaque do destino de soltar e o tratamento de dados de texto funcionem corretamente.

DropHelper impede componentes EditText na visualização do destino de soltar. hierarquia de roubar o foco da visualização que a contém durante interações de arrastar.

Além disso, se o ClipData de arrastar e soltar incluir dados de texto e URI, DropHelper seleciona um dos EditText no destino de soltar para lidar com os dados de texto. A seleção é baseada seguinte ordem de precedência:

  1. O EditText em que o ClipData é solto.
  2. A EditText que contém o cursor de texto (acento circunflexo).
  3. O primeiro EditText fornecido à chamada para DropHelper.Options.Builder.addInnerEditTexts(EditText...).

Para definir um EditText como o gerenciador de dados de texto padrão, transmita o EditText como o primeiro argumento da chamada para o DropHelper.Options.Builder.addInnerEditTexts(EditText...). Por exemplo, se o destino de soltar processar imagens, mas tiver campos de texto editáveis T1, T2 e T3, torne o T2 o padrão desta maneira:

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

Processar dados em destinos de soltar

O método DropHelper.configureView() aceita uma OnReceiveContentListener. criada para processar o ClipData de arrastar e soltar. A função de arrastar e soltar dados são fornecidas ao ouvinte em uma Objeto ContentInfoCompat. Há dados de texto no objeto. Mídia, como imagens, é representada por URIs.

O OnReceiveContentListener também processa os dados enviados ao destino de soltar: interações do usuário diferentes de arrastar e soltar, como copiar e colar: quando DropHelper.configureView() é usado para configurar o seguinte tipos de visualização:

  • Todas as visualizações, se o usuário estiver executando o Android 12 ou mais recente.
  • AppCompatEditText, se o usuário tiver uma versão do Android até a 7.0.
.

Tipos MIME, permissões e validação de conteúdo

A verificação de tipo MIME por DropHelper é baseada no método de arrastar e soltar ClipDescription, que é criada pelo app que fornece os dados de arrastar e soltar. Valide o ClipDescription para garantir que os tipos MIME sejam definidos corretamente.

DropHelper solicita todas as permissões de acesso para URIs de conteúdo contidos na arraste e solte ClipData. Para mais informações, consulte DragAndDropPermissions A permitem que você resolva os URIs de conteúdo ao processar o comando de arrastar e soltar dados.

DropHelper não valida os dados retornados pelos provedores de conteúdo quando resolver URIs nos dados descartados. Verifique se há valores nulos e verifique a exatidão de quaisquer dados resolvidos.