Drag e Drop no Android, Entendendo e Utilizando

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes! Você receberá um email de confirmação. Somente depois de confirma-lo é que eu poderei lhe enviar os conteúdos semanais exclusivos. Os artigos em PDF são entregues somente para os inscritos na lista.

Email inválido.
Blog /Android /Drag e Drop no Android, Entendendo e Utilizando

Drag e Drop no Android, Entendendo e Utilizando

Vinícius Thiengo
(5842) (24)
Go-ahead
"O método consciente de tentativa e erro é mais bem-sucedido que o planejamento de um gênio isolado."
Peter Skillman
Prototipagem Android
Capa do curso Prototipagem Profissional de Aplicativos
TítuloAndroid: Prototipagem Profissional de Aplicativos
CategoriasAndroid, Design, Protótipo
AutorVinícius Thiengo
Vídeo aulas186
Tempo15 horas
ExercíciosSim
CertificadoSim
Acessar Curso
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Lendo
TítuloManual de DevOps: como obter agilidade, confiabilidade e segurança em organizações tecnológicas
CategoriaEngenharia de Software
Autor(es)Gene Kim, Jez Humble, John Willis, Patrick Debois
EditoraAlta Books
Edição
Ano2018
Páginas464
Conteúdo Exclusivo
Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba gratuitamente conteúdos Android sem precedentes!
Email inválido

Opa, blz?

Nesse vídeo mostro como adicionar a funcionalidade de Drag e Drop a uma APP Android utilizando no caso os listeners OnDragListener e OnLongClickListener. Muito comum em jogos e aplicações Web a funcionalidade de Drag e Drop não vem em um entidade pronta para ser implementada, porém é bastante simples e exige poucos linhas de código para rodar no Android. Entre as várias formas de poder validar se um container vai ou não aceitar um elemento que está em drag eu mostrei o uso da entidade ClipData, que não tem muito o que fazer a não ser verificar se tem ou não os dados que enviamos para poder validar. Quanto ao quarto parâmetro do método startDrag() ele realmente não tem opções e o Google solicita que coloquemos o valor "0". Fique atento quanto ao uso do DragShadowBuilder, pois ele é responsável por apresentar uma shadow view ao usuário para ele ter o feedback de que está realmente arrastando o objeto, por que falo isso? Simplesmente porque o Drag e Drop funciona perfeitamente se vc não utilizar uma View válida no DragShadow, porém o usuário somente terá que o elemento foi alterado de lugar quando ele realizar o drop, caso contrário nada é retornado como feedback. Então é isso, não tem muito o que falar nessa implementação básica, não esqueça de ler os guidelines do Drag e Drop no Android.

O link para download do projeto se encontra logo abaixo do post.

Segue link da página apresentada no vídeo:

Página de implementação do Drag e Drop no site oficial do Android

Vlw.

Investir em Você é Barra de Ouro a R$ 2,00. Cadastre-se e receba grátis conteúdos Android sem precedentes!
Email inválido

Relacionado

APP Android: Thiengo [Calopsita] 2.0 BetaAPP Android: Thiengo [Calopsita] 2.0 BetaAndroid
Volley no Android, Entendendo e UtilizandoVolley no Android, Entendendo e UtilizandoAndroid
ImageLoader Com a Lib Volley no AndroidImageLoader Com a Lib Volley no AndroidAndroid
ORMLite no Android, Entendendo e UtilizandoORMLite no Android, Entendendo e UtilizandoAndroid

Compartilhar

Comentários Facebook

Comentários Blog (24)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Helton (1) (0)
18/05/2018
Ola Thiengo cara legal seu post
Mais a dias estou quebrando a cabeça com um expandable desse consegui fazer aos trancos e barrancos um quase igual esse mais a minha duvida agora é buscar esses dados la no banco de dados mysql tem alguma dica. Ideia ou exemplo rsss vlw obrigado
Responder
Vinícius Thiengo (0) (0)
19/05/2018
Helton, tudo bem?

O que percebi é que sua dificuldade está em obter os dados do MySQL. Tanto o algoritmo de Drag e Drop quanto o algoritmo com o Expandable são códigos de interface, independentes de como será realizada a obtenção dos dados, em seu caso, obtenção do MySQL.

Minha dica é que você estude a parte em texto do link abaixo, pois nele, apesar do foco ser o FCM, eu abordo passo a passo a obtenção de dados de uma base MySQL em um backend Web construído em Apache e PHP:

-> https://www.thiengo.com.br/fcm-android-dominio-do-problema-implementacao-e-testes-com-servidor-de-aplicativo-parte-1

Helton, ao final você provavelmente saberá como prosseguir com o seu projeto.

Abraço.
Responder
31/03/2016
Boa tarde!

Excelente conteúdo!
Só não entendi como posso restringir que uma Imageview não consiga fazer o drop numa LinearLayout específica.

Poderia me ajudar?

Obrigado!
Responder
Vinícius Thiengo (0) (0)
02/04/2016
Fala Renan, blz?
Vídeo antigo, não lembro de alguns trechos... mas enfim, qual está sendo a dificuldade? Deu uma lida tb na doc do drag e drop (http://developer.android.com/intl/pt-br/guide/topics/ui/drag-drop.html )? Outras possíveis soluções (https://android-arsenal.com/search?q=drag ). Abraço
Responder
28/09/2015
Fala Thiengo, tranquilo?

Sou novo na área de desenvolvimento android e tenho acompanhado o seu site.

Tenho uma dúvida. Por exemplo: eu fiz um app com banco de dados. Toda pessoa que baixar esse app vai baixar também o banco de dados? Ou as app's de hoje deixam o banco na nuvem?
Como que funciona?
Obrigado pela atenção, abraço.
Deus te abençoe.
Responder
Vinícius Thiengo (1) (0)
30/09/2015
Fala Yuri, blz?
Se criou o bd com o SQLite local do Android (ou uma lib que realiza o trabalho com ele), sim, o bd será local (baixado) e rodará somente para o device que baixou a APP. Se quiser um bd remoto (na nuvem), vc terá de implementar a lógica de programação na APP para comunicar com seu bd remoto (que tb deverá ser criado por ti). Porém hj temos algumas entidades que facilitam esse processo para nós developers, principalmente para aqueles que não têm mta intimidade com o backend remoto, o Parse.com (https://www.parse.com/ ) é uma dessas entidades, com ele é bem mais fácil trabalhar com bd na nuvem, notifications, ... veja esse vídeo que fiz (http://www.thiengo.com.br/parse-notification-push-message-android-parte-7 ). Abraço
Responder
30/09/2015
O que você acha mais recomendado?
O BD vai ter poucos dados, melhor deixar para que cada user baixe o bd ou deixar na nuvem?
No caso de ser local, eu criaria o banco em um caminho que quando o usuário fosse instalar, o banco iria ficar lá também?
Obrigado desde já pela ajuda.
Responder
Vinícius Thiengo (0) (0)
03/10/2015
Yuri, se o bd não for sofrer atualizações de alguma entidade remota (um Web Site, por exemplo), ou seja, se ele for quase que sempre estático (sofrendo atualizações somente com as atualizações da APP na PlayStore) então melhor que deixe ele na APP, pois além de ter o carregamento da APP de imediato com os dados sendo locais, vc não correrá o risco de ter problemas de apresentação de dados se o user acabou de baixar sua APP e a conexão dele é 3G (e ainda com sinal fraco), aparentando problema em sua APP e não na rede. Vc pode ler o SQLite database direto de seu Assets folder, veja essa resposta no stack (http://stackoverflow.com/a/5949629/2578331 ). Abraço
Responder
Renato (0) (0)
10/09/2014
Como faço em relação a uma ListView?
Responder
Vinícius Thiengo (0) (0)
10/09/2014
Fala Renato, blz?
No caso seria o DragDrop de uma lista para outra? Tente colocar o Listener do DragDrop (setOnDragListener) em cada linha do ListView, ou seja, no método getView() do da classe que extends o BaseAdapter, acho que assim vai sem problemas. Abraço
Responder
Renato (0) (0)
17/08/2014
Oi Thiengo, tudo blz? Cara estou construindo uma app para android, e queria saber q tipo de banco vc me recomenda, o SQLite ou um banco remoto com servidor web? ps: (Nessa app eu tenho um sisteminha de chat onde meus usuários poderão trocar mensagens, tipo o Whatsapp, mas logico q com um numero de usuários bem inferior rs) Abraços, seu blog é Show!
Responder
Vinícius Thiengo (0) (0)
18/08/2014
Fala Renato, blz? Então, pelo o que vc mencionou, acredito que será inevitavel a utilização de um bd remoto, porém acho que dá para utilizar o SQLite tb para simular um cache na APP. Abraço
Responder
Gustavo (0) (0)
13/08/2014
Ola Thiengo tudo bom? cara é o seguinte estava seguindo alguns videos q vc fez sobre ActionBar, tava tudo certinho, mas quando chegou na parte das tabs fiz tudo como vc falou mas sempre que eu vou compilar o logcat me da esse erro

08-13 05:39:28.226: E/AndroidRuntime(552): FATAL EXCEPTION: main
08-13 05:39:28.226: E/AndroidRuntime(552): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.ilovemusic.interface_1/br.com.ilovemusic.interface_1.MainActivity}: java.lang.IllegalStateException: Action Bar Tab must have a Callback
08-13 05:39:28.226: E/AndroidRuntime(552): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.os.Looper.loop(Looper.java:123)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-13 05:39:28.226: E/AndroidRuntime(552): at java.lang.reflect.Method.invokeNative(Native Method)
08-13 05:39:28.226: E/AndroidRuntime(552): at java.lang.reflect.Method.invoke(Method.java:521)
08-13 05:39:28.226: E/AndroidRuntime(552): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-13 05:39:28.226: E/AndroidRuntime(552): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-13 05:39:28.226: E/AndroidRuntime(552): at dalvik.system.NativeStart.main(Native Method)
08-13 05:39:28.226: E/AndroidRuntime(552): Caused by: java.lang.IllegalStateException: Action Bar Tab must have a Callback
08-13 05:39:28.226: E/AndroidRuntime(552): at com.actionbarsherlock.internal.app.ActionBarImpl.configureTab(ActionBarImpl.java:429)
08-13 05:39:28.226: E/AndroidRuntime(552): at com.actionbarsherlock.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:455)
08-13 05:39:28.226: E/AndroidRuntime(552): at com.actionbarsherlock.internal.app.ActionBarImpl.addTab(ActionBarImpl.java:443)
08-13 05:39:28.226: E/AndroidRuntime(552): at br.com.ilovemusic.interface_1.MainActivity.onCreate(MainActivity.java:41)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-13 05:39:28.226: E/AndroidRuntime(552): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-13 05:39:28.226: E/AndroidRuntime(552): ... 11 more

Você sabe me dizer do que se trata esse erro? Desde já obrigado!
Responder
Vinícius Thiengo (0) (0)
13/08/2014
Fala Gustavo, blz?
Faz o seguinte, baixe o projeto e rode ele em seu ambiente, imagino que vc foi fazendo por ti mesmo na mão e provavelmente deve ter deixado alguma coisa passar. O erro está em um callback que vc não implementou. Tenta pegar o que está aqui e ver se passa sem problemas. Ai depois ve se consegue com ele corrigir o seu. Abraço
Responder
Gustavo (1) (0)
14/08/2014
Valeu cara, consegui o erro foi que quando eu criei as tabs eu coloquei todas com o nome "tab1" rsrs é que eu fiz um e copiei para criar os outros ai esqueci de mudar o numero, mas valeu cara seus videos tem me ajudado muito vc é fera, obrigado mesmo.
Responder
12/08/2014
Você tem algum video aula onde ensina a validar campos do tipo decimal, inteiros, datas, email e outros no android ?
Responder
Vinícius Thiengo (0) (0)
12/08/2014
Fala Luiz, blz?
Então, não tenho vídeos sobre validação... isso é mais a parte de Java mesmo. Dê uma olhada em espressões regulares em Java, pode lhe ajudar. Abraço
Responder
wiliam (0) (0)
11/08/2014
Ola amigo, tenho uma duvida poderia me ajudar? é que eu estou programando na plataforma android estou criando um app com ActionBar e estou usando o suport SherlockActionBar, no meu codigo nao deu erros, mas sempre q eu vou compilar ele abre o logcat e me da esse erro aqui q eu nao consigo resolver

08-12 00:28:14.880: E/AndroidRuntime(275): FATAL EXCEPTION: main
08-12 00:28:14.880: E/AndroidRuntime(275): java.lang.NullPointerException
08-12 00:28:14.880: E/AndroidRuntime(275): at br.com.ilovemusic.interface_1.MainActivity.onCreateOptionsMenu(MainActivity.java:40)
08-12 00:28:14.880: E/AndroidRuntime(275): at com.actionbarsherlock.app.SherlockActivity.onCreatePanelMenu(SherlockActivity.java:184)
08-12 00:28:14.880: E/AndroidRuntime(275): at com.actionbarsherlock.ActionBarSherlock.callbackCreateOptionsMenu(ActionBarSherlock.java:560)
08-12 00:28:14.880: E/AndroidRuntime(275): at com.actionbarsherlock.internal.ActionBarSherlockCompat.preparePanel(ActionBarSherlockCompat.java:466)
08-12 00:28:14.880: E/AndroidRuntime(275): at com.actionbarsherlock.internal.ActionBarSherlockCompat.dispatchInvalidateOptionsMenu(ActionBarSherlockCompat.java:265)
08-12 00:28:14.880: E/AndroidRuntime(275): at com.actionbarsherlock.internal.ActionBarSherlockCompat$1.run(ActionBarSherlockCompat.java:960)
08-12 00:28:14.880: E/AndroidRuntime(275): at android.os.Handler.handleCallback(Handler.java:587)
08-12 00:28:14.880: E/AndroidRuntime(275): at android.os.Handler.dispatchMessage(Handler.java:92)
08-12 00:28:14.880: E/AndroidRuntime(275): at android.os.Looper.loop(Looper.java:123)
08-12 00:28:14.880: E/AndroidRuntime(275): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-12 00:28:14.880: E/AndroidRuntime(275): at java.lang.reflect.Method.invokeNative(Native Method)
08-12 00:28:14.880: E/AndroidRuntime(275): at java.lang.reflect.Method.invoke(Method.java:521)
08-12 00:28:14.880: E/AndroidRuntime(275): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-12 00:28:14.880: E/AndroidRuntime(275): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-12 00:28:14.880: E/AndroidRuntime(275): at dalvik.system.NativeStart.main(Native Method)


Poderia me ajudar? obrigado
Responder
Vinícius Thiengo (0) (0)
11/08/2014
Fala Wiliam, blz?
Aparentemente vc está tentando acessar uma entidade com valor Null. Entidade que está no método onCreateOptionsMenu(), mais precisamente na linha 40 de seu arquivo MainActivity.java. Provavelmente é uma variavel que vc não inicializou e deveria ser um objeto. Dê uma olhada lá. Abraço
Responder
wiliam (0) (0)
12/08/2014
Valeu cara, eu só queria saber mais uma coisinha, você recomenda usar aquele suporte q é criada automaticamente chada "appCompat_v7"? ou o melhor é o SherlockActionBar msm? obrigado.
Responder
Vinícius Thiengo (0) (0)
12/08/2014
Wiliam hj eu ficaria com o appCompat_v7, pois com ele eu sei que o Material Design recem lançado tem suporte, já com o SHerlock não sei se terá o suporte e o Material Design ficou show de bola. Abraço
Responder
11/08/2014
Thiengo poderia me ajudar ? Como posso obter o endereço MAC no Android
Responder
Vinícius Thiengo (0) (0)
11/08/2014
Fala Luiz, blz?
Dê uma olhada na resposta certa desse link:

http://stackoverflow.com/questions/10831578/how-to-find-mac-address-of-an-android-device-programatically

Acho que é isso que vc está procurando. Abraço
Responder
12/08/2014
Obrigadão. Depois que publiquei aqui e fui pesquisando e usei este exemplo desse site que você indicou agora e outros. É que precisava comparar o SMS recebido na minha classe OnReceive e com o mac do aparelho.
Responder