Android – Boas Práticas para o evento onClick
Nesta dica irei abordar sobre boas práticas (best practices) de como definir o evento onClick
dos botões no Android.
Funciona, mas…
Vamos criar um botão simples em um layout xml da seguinte forma:
<Button
android:id="@+id/btnMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:onClick="btnMessageOnClick"
android:text="Show Message"
/>
Note na linha 7 que foi adicionado a propriedade android:onClick
com o valor btnMessageOnClick
, ou seja, toda vez que o usuário clicar nesse botão, será executado o método btnMessageOnClick()
da classe onde esse layout xml está referenciado. Com isso, o Activity que está utilizando este layout xml precisa deste método e faremos assim:
public void btnMessageOnClick() {
Toast.makeText(MainActivity.this, "Hello World",
Toast.LENGTH_LONG).show();
}
Isso é o suficiente para que o botão funcione. Toda vez que o usuário clicar no botão, será exibido a mensagem "Hello World"
. Funciona? Sim, mas…
- Se você tentar renomear (refactor) o método do evento
onClick
de forma automática, pelo menos no Eclipse, ele não irá renomear o método no layout xml, quebrando o código. Se você não corrigir, o erro só daria em tempo de execução. - Em um aplicativo muito grande, se torna improdutivo dar manutenção nesses métodos, pois fica difícil localizar quais views que este método faz referência e vice versa.
- Se o nome do método não estiver bem explícito que é um evento
onClick
e está sendo referenciado em um layout xml, ou não houver um comentário especificando isso, o programador poderá não saber disso até que ocorra um erro.
Boa Prática
Vamos agora adicionar o evento onClick
para o botão de outra forma. Remova o atributo android:onClick
do xml do botão, não há necessidade de fazer alguma referência do código no layout.
Remova o método btnMessageOnClick()
e coloque este listener no lugar:
private OnClickListener btnMessageOnClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Hello World",
Toast.LENGTH_LONG).show();
}
};
Agora só falta referenciar o botão ao seu listener, para isso basta colocar o seguinte código no método onCreate()
ou resume()
do Activity/Fragment
:
Button btnMessage = (Button) findViewById(R.id.btnMessage);
btnMessage.setOnClickListener(btnMessageOnClickListener);
Dica O método findViewById()
pode retornar null caso não encontre a view procurada.
Agora está pronto seu evento onClick
! Desta forma todos os problemas levantados no tópico anterior serão resolvidos com esta boa prática.