onBackPressed e onActivityResult
Para aqueles que precisam de informações preenchidas por usuários e utilizam uma Activity para isso, utilizar o método startActivityForResult(intent, int) é bastante conveniente. No entanto, internet a fora as implementações em geral utilizam um botão extra na Activity que será clicado para confirmar informações do usuário, como no exemplo abaixo.
Exemplo de botão para confirmação |
Particularmente, não gosto dessa solução. Acredito que o botão "voltar", por padrão em todo telefone android, poderia perfeitamente realizar esse trabalho. Para utilizá-lo devemos sobrescrever o método onBackPressed() da Activity que coleta a escolha do usuário.
@Override public void onBackPressed() { super.onBackPressed(); }
Ao sobrescrever o método, precisamos verificar qual RadioButton foi marcado, colocar os dados em uma Intent ao mesmo tempo em que sinalizamos o sucesso da escolha, com setResult(int, Intent) e finalizar a Activity utilizando o método finish().
Em nossa Activity de exemplo, temos dois botões. Assim, vamos verificar qual dos dois está selecionado e sinalizar isso em uma String. Feito isso, criamos uma Intent para retornar a String que sinaliza qual botão foi escolhido. Por fim, sinalizamos que o resultado foi escolhido de maneira correta.
@Override public void onBackPressed() { super.onBackPressed(); String entrada; if ( button1.isChecked()) { entrada = "Voce escolheu botao 1"; } else if ( button2.isChecked()) { entrada = "Voce escolheu botao 2"; } Intent retorno = new Intent(); retorno.putExtra("retorno", retorno); setResult(RESULT_OK, retorno); }
Ao executarmos, percebemos que infelizmente não funciona! =( O problema está na chamada ao método super.onBackPressed()! Neste link você pode conferir que o método em questão executa uma chamada ao método finish() que termina a execução de uma Activity. Ou seja, qualquer linha de código após a chamada ao super não será executada.
Basta, então, alterar a ordem do código e certificar-se de que a Activity não será finalizada antes de executarmos setResult(int, Intent) pois este é o método que vai garantir o retorno dos dados!
Obs:
1. Também é possível eliminar a chamada ao método super.onBackPressed(). Para isso, basta executar finish()! Como dito acima, o efeito será o mesmo. Porém, não temos garantias de que futuras versões do android virão a manter essa implementação.
2. Certifique-se de que a Activity será encerrada mesmo que dados não sejam enviados de volta! Ou seja, não coloque a chamada para finish() ou super() dentro de um condicional! ;)
E nosso código final ficou assim
@Override public void onBackPressed() { String entrada; if ( button1.isChecked()) { entrada = "Voce escolheu botao 1"; } else if ( button2.isChecked()) { entrada = "Voce escolheu botao 2"; } Intent retorno = new Intent(); retorno.putExtra("retorno", retorno); setResult(RESULT_OK, retorno); super.onBackPressed(); }
Nenhum comentário:
Postar um comentário