Tendo uma sólida experiência na área não Java e não Android, estou aprendendo Android.
Tenho muita confusão com diferentes áreas, uma delas é como lidar com cliques de botão. Existem pelo menos 4 maneiras de fazer isso (!!!), elas estão brevemente listadas aqui
para fins de consistência, vou listá-los:
Tenha um membro da
View.OnClickListener
classe na atividade e atribua-o a uma instância que tratará daonClick
lógica noonCreate
método da atividade.Crie 'onClickListener' no método de atividade 'onCreate' e atribua-o ao botão usando setOnClickListener
Implemente 'onClickListener' na própria atividade e atribua 'this' como um ouvinte para o botão. No caso de a atividade ter poucos botões, o id do botão deve ser analisado para executar o manipulador 'onClick' para o botão apropriado
Tenha um método público na atividade que implementa a lógica 'onClick' e atribua-o ao botão na declaração XML da atividade
Questão 1:
São todos métodos, existe alguma outra opção? (Não preciso de mais nenhum, só curiosidade)
Para mim, a forma mais intuitiva seria a mais recente: requer a menor quantidade de código para ser digitada e é a mais legível (pelo menos para mim).
Porém, não vejo essa abordagem amplamente usada. Quais são os contras de usá-lo?
Questão 2:
Quais são os prós / contras de cada um desses métodos? Por favor, compartilhe sua experiência ou um bom link.
Qualquer feedback é bem-vindo!
PS Eu tentei pesquisar no Google e encontrar algo sobre esse tópico, mas as únicas coisas que encontrei foram a descrição de "como" fazer isso, não por que isso é bom ou ruim.
onCreate()
não muito longa. As atribuições do ouvinte de clique e as classes anônimas podem ser fatoradas em um método auxiliar separado que é chamado deonCreate()
.# 1 Eu uso o último freqüentemente quando tenho botões no layout que não são gerados (mas estáticos obviamente).
Se você o usa na prática e em um aplicativo de negócios, preste atenção extra aqui, porque quando você usa o ofuscador de origem como o ProGuard, você precisará marcar esses métodos em sua atividade para não serem ofuscados.
Para arquivar algum tipo de segurança de tempo de compilação com essa abordagem, dê uma olhada no Android Lint ( exemplo ).
# 2 Os prós e contras de todos os métodos são quase os mesmos e a lição deve ser:
Se você tiver que atribuir o mesmo
OnClickListener
a várias instâncias de botão, salve-o no escopo da classe (# 1). Se você precisar de um ouvinte simples para um botão, faça uma implementação anônima:Tendo a não implementar o
OnClickListener
na atividade, isso fica um pouco confuso de vez em quando (especialmente quando você implementa vários outros manipuladores de eventos e ninguém sabe o quethis
está fazendo).fonte
Eu prefiro a opção 4, mas faz sentido intuitivo para mim porque eu trabalho demais em Grails, Groovy e JavaFX. Conexões "mágicas" entre a visualização e o controlador são comuns em todos. É importante nomear bem o método:
Na visualização, adicione o método onClick ao botão ou outro widget:
Em seguida, na aula, manipule o método:
Novamente, nomeie o método claramente, algo que você deve fazer de qualquer maneira, e a manutenção torna-se uma segunda natureza.
Uma grande vantagem é que agora você pode escrever testes de unidade para o método. A opção 1 pode fazer isso, mas 2 e 3 são mais difíceis.
fonte
A forma mais usada é, declaração anônima
Além disso, você pode criar o objeto View.OnClickListener e defini-lo como botão mais tarde, mas você ainda precisa substituir o método onClick, por exemplo
Quando sua atividade implementa a interface OnClickListener, você deve substituir o método onClick (Exibir v) no nível de atividade. Então você pode atribuir esta atividade como ouvinte do botão, porque ele já implementa a interface e substitui o método onClick ()
(imho) 4ª abordagem usada quando vários botões têm o mesmo manipulador, e você pode declarar um método na classe de atividade e atribuir este método a vários botões no layout xml, você também pode criar um método para um botão, mas neste caso eu prefira declarar manipuladores dentro da classe de atividade.
fonte
As opções 1 e 2 envolvem o uso de uma classe interna que tornará o código uma espécie de desordem. A opção 2 é meio confusa porque haverá um ouvinte para cada botão. Se você tiver um pequeno número de botões, tudo bem. Para a opção 4, acho que será mais difícil depurar, pois você terá que voltar e quarta o código xml e java. Eu pessoalmente uso a opção 3 quando preciso lidar com vários cliques de botão.
fonte
Minha amostra, testada no Android Studio 2.1
Definir botão no layout xml
Detecção de pulsação Java
fonte
Para tornar as coisas mais fáceis, asp Questão 2 declarada, você pode fazer uso do método lambda como este para economizar memória variável e para evitar navegar para cima e para baixo em sua classe de visualização
mas se você deseja aplicar o evento de clique ao botão de uma vez em um método.
você pode usar a Questão 3 de @D. Resposta Tran. Mas não se esqueça de implementar sua classe de visualização com
View.OnClickListener
.Em outro, para usar a Pergunta # 3 corretamente
fonte
Pergunta nº 1 - Essa é a única maneira de lidar com cliques de visualização.
Pergunta # 2 -
Opção # 1 / Opção # 4 - Não há muita diferença entre a opção # 1 e a opção # 4. A única diferença que vejo é que a atividade de um caso está implementando OnClickListener, enquanto, no outro caso, haveria uma implementação anônima.
Opção nº 2 - Neste método, uma classe anônima será gerada. Este método é um pouco complicado, pois você precisará fazer isso várias vezes, se tiver vários botões. Para classes anônimas, você deve ter cuidado ao lidar com vazamentos de memória.
Opção nº 3 - No entanto, esta é uma maneira fácil. Normalmente, os programadores tentam não usar nenhum método até que o escrevam e, portanto, esse método não é amplamente utilizado. Você veria que a maioria das pessoas usa a Opção # 4. Porque é mais limpo em termos de código.
fonte
Também existem opções disponíveis na forma de várias bibliotecas que podem tornar esse processo muito familiar para pessoas que usaram outros frameworks MVVM.
https://developer.android.com/topic/libraries/data-binding/
Mostra um exemplo de biblioteca oficial, que permite vincular botões como este:
fonte
Etapa 1: Crie um arquivo XML:
Etapa 2: Criar MainActivity:
HappyCoding!
fonte