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:
- O
Activity
atual, usado para URI permissões.- Um
View
que serve como destino de soltar.- Os tipos MIME o destino de soltar pode aceitar os dados soltos.
- Um
- Opções de configuração para o destino de soltar, especialmente uma lista de
campos
EditText
incorporados. - Um
OnReceiveContentListener
para lidar com dados descartados.
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:
- O
EditText
em que oClipData
é solto. - A
EditText
que contém o cursor de texto (acento circunflexo). - O primeiro
EditText
fornecido à chamada paraDropHelper.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.