Pregunta

Estoy creando una aplicación estilo asistente, donde necesito mantener vivos los datos del usuario entre las actividades A y B.A tiene un botón programable Siguiente y B tiene un botón programable Atrás.

Cuando usas FLAG_ACTIVITY_REORDER_TO_FRONT Puedo mantener vivos los datos del usuario cuando se utilizan los botones programables, porque cada actividad se reutiliza.

Pero, cuando el usuario presiona el botón Atrás de B, B muere, debido a que ese botón usa finalizar() implícitamente.

Luego, intenté anular onBackPressed en B, agregándole el mismo comportamiento que mi botón Atrás, pensando que el botón Atrás se comportará exactamente como el botón anterior (no terminará B).

Ahora, volviendo de B a A con la tecla Atrás, todo está bien.En este punto con el foco en A, cuando el usuario presiona el botón Atrás nuevamente, el comportamiento esperado es que la aplicación abandone.

El problema es que el comportamiento esperado no se produce, dado que B todavía está vivo;para que se anule onBackPressed en B sigue escuchando y en su lugar se produce algún otro comportamiento.

¿Cómo puedo terminar de escuchar con el overriden? onBackPressed en B, para que cuando el foco esté en A la aplicación salga?

Gracias de antemano.

¿Fue útil?

Solución 2

Bueno, pude resolver mi problema con una solución natural de Android:

Siguiendo el consejo de Krylez, dejé de usar FLAG_ACTIVITY_REORDER_TO_FRONT, por lo que ya no tengo conflictos con el botón físico y ahora estoy reciclando el Intent que inicia mi asistente.

En A, tengo un método muy común que se llama cuando el usuario presiona el botón programable Continuar para ir a B.La actividad A es solo informativa, por lo que no es necesario colocar los extras de Intent con los datos del usuario cuando se va a B, de esta manera:

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

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

Cuando comienza la actividad B, siempre debe buscar si hay datos del usuario disponibles en los extras del Intent, así:

    @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"));
    }
}

Ahora, tal vez desde B, el usuario presiona cualquier botón de retroceso disponible (suave o fuerte) para regresar a A.En este caso, necesitamos poner los datos del usuario en los extras de Intent, así:

    /** 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, cuando el usuario presiona el botón suave Continuar nuevamente, la nueva Actividad B tendrá los datos que el usuario ingresó la última vez.

Espero que esto ayude a alguien.

Otros consejos

Considere hacer lo mismo que el comentario de Krylez.O tal vez quieras usar fragmentos.Si su objetivo son SDK anteriores a 3.x, consulte biblioteca de soporte.

Hay proyectos de muestra dentro de la carpeta SDK, que utilizan el estilo de asistente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top