Páginas

terça-feira, 21 de agosto de 2012

Utilizando onBackPressed


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