Question

Je crée une application de style assistant, dans laquelle je dois conserver les données utilisateur entre les activités A et B.A a un bouton contextuel Suivant et B a un bouton contextuel Retour.

Lors de l'utilisation FLAG_ACTIVITY_REORDER_TO_FRONT Je peux conserver les données utilisateur en vie lorsque les boutons programmables sont utilisés, car chaque activité est réutilisée.

Mais, lorsque l'utilisateur appuie sur le bouton dur Retour de B, B meurt, à cause de ce bouton dur, il utilise implicitement finish().

Ensuite, j'ai essayé de remplacer onBackPressed en B, en y ajoutant le même comportement que mon bouton contextuel Retour, pensant que le bouton matériel Retour se comportera exactement comme l'ancien bouton (pas terminer B).

Maintenant, en revenant de B à A avec la touche matérielle Retour, tout va bien.À ce stade, avec le focus sur A, lorsque l'utilisateur appuie à nouveau sur le bouton de retour, le comportement attendu est que l'application quitte.

Le problème est que le comportement attendu ne se produit pas, étant donné que B est toujours en vie ;donc ça a été annulé onBackPressed en B écoute toujours, et un autre comportement se produit à la place.

Comment puis-je terminer l'écoute avec le remplacement onBackPressed en B, de sorte que lorsque le focus est en A, l'application s'en va ?

Merci d'avance.

Était-ce utile?

La solution 2

Eh bien, j'ai pu résoudre mon problème avec une solution Android naturelle :

Suite à l'astuce Krylez, j'ai arrêté d'utiliser FLAG_ACTIVITY_REORDER_TO_FRONT, je n'ai donc plus de conflits avec le bouton dur, et maintenant je recycle l'Intent qui démarre mon assistant.

En A, j'ai une méthode très courante qui est appelée lorsque l'utilisateur appuie sur le bouton contextuel Continuer pour accéder à B.L'activité A est simplement informative, elle n'a donc pas besoin de mettre les extras d'Intent avec les données de l'utilisateur lorsqu'elle passe à B, comme ceci :

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

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

Lorsque l'activité B démarre, elle doit toujours rechercher si des données utilisateur sont disponibles dans les extras d'Intent, comme ceci :

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

Maintenant, peut-être à partir de B, l'utilisateur appuie sur n'importe quel bouton de retour disponible (doux ou dur) pour revenir à A.Dans ce cas, nous devons mettre les données de l'utilisateur dans les extras d'Intent, comme ceci :

    /** 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);
}

Enfin, lorsque l'utilisateur appuie à nouveau sur le bouton programmable Continuer, la nouvelle activité B contiendra les données saisies par l'utilisateur la dernière fois.

J'espère que cela aide quelqu'un.

Autres conseils

Pensez à faire comme le commentaire de Krylez.Ou vous voudrez peut-être utiliser fragments.Si vous ciblez des SDK antérieurs à 3.x, consultez bibliothèque de support.

Il existe des exemples de projets dans le dossier SDK, qui utilisent le style assistant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top