Pergunta

Estou criando uma aplicação estilo Wizard, onde preciso manter vivos os dados do usuário entre as atividades A e B.A tem um botão virtual Próximo e B tem um botão virtual Voltar.

Ao usar FLAG_ACTIVITY_REORDER_TO_FRONT Posso manter os dados do usuário ativos quando os botões virtuais são usados, porque cada atividade é reutilizada.

Mas, quando o usuário pressiona o botão Voltar de B, B morre, devido a esse botão físico usar finish() implicitamente.

Então, tentei substituir onBackPressed em B, adicionando a ele o mesmo comportamento do botão Voltar, pensando que o botão Voltar se comportará exatamente como o botão anterior (não terminar B).

Agora, voltando de B para A com a tecla Voltar, está tudo bem.Neste ponto com o foco em A, quando o usuário pressiona novamente o botão físico Voltar, o comportamento esperado é que a aplicação saia.

O problema é que o comportamento esperado não ocorre, visto que B ainda está vivo;então isso é substituído onBackPressed em B ainda está ouvindo e, em vez disso, ocorre algum outro comportamento.

Como posso terminar de ouvir com o override onBackPressed em B, para que quando o foco estiver em A a aplicação saia?

Desde já, obrigado.

Foi útil?

Solução 2

Bem, eu poderia resolver meu problema com uma solução Android natural:

Seguindo a dica do Krylez, parei de usar FLAG_ACTIVITY_REORDER_TO_FRONT, para não ter mais conflitos com o hard button, e agora estou reciclando o Intent que inicia meu assistente.

Em A, tenho um método muito comum que é chamado quando o usuário pressiona o botão continuar para ir para B.A atividade A é apenas informativa, portanto não precisa colocar extras do Intent com os dados do usuário ao ir para B, assim:

    /** Called when the user presses the Continue button*/
public void continueButtonOnClick(View view) {

        Intent intent = this.getIntent();
        intent.setClass(this, StepOneRegisterWizardActivity.class);
        startActivity(intent);
}

Ao iniciar a atividade B, ela deve sempre buscar se há dados do usuário disponíveis nos extras do Intent, assim:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_step_one_register_wizard);

    // Get the components of the content layout
    usernameEditText = (EditText)findViewById(R.id.usernameEditText);
    passwordEditText = (EditText)findViewById(R.id.passwordEditText);

    getIntentExtras();
}

private void getIntentExtras() {
    Intent intent = this.getIntent();

    Bundle bundle = intent.getExtras();
    if (bundle != null) {
        usernameEditText.setText(bundle.getCharSequence("usernameEditText"));
        passwordEditText.setText(bundle.getCharSequence("passwordEditText"));
    }
}

Agora, talvez de B, o usuário pressione qualquer botão Voltar disponível (suave ou forte) para voltar a A.Neste caso, precisamos colocar os dados do usuário nos extras do Intent, assim:

    /** Called when the user presses the Back soft button*/
public void backButtonOnClick(View view) {
    onBackPressed();
}

@Override
/** Called when the user presses the Back hard button*/
public void onBackPressed() {
    finish();

    Intent intent = this.getIntent();
    intent.setClass(this, StepZeroRegisterWizardActivity.class);
    intent.putExtra("usernameEditText", usernameEditText.getText());
    intent.putExtra("passwordEditText", passwordEditText.getText());
    startActivity(intent);
}

Finalmente, quando o usuário pressionar o botão continuar novamente, a nova Atividade B terá os dados que o usuário inseriu da última vez.

Eu espero que isso ajude alguém.

Outras dicas

Considere fazer o comentário de Krylez.Ou você pode querer usar fragmentos.Se você segmentar SDKs anteriores à versão 3.x, consulte biblioteca de suporte.

Existem projetos de exemplo dentro da pasta SDK, que usam o estilo do assistente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top