48 votes

Comment retourner un résultat à travers plusieurs activités

dans une partie de mon application, il s'agit d'une structure d'activités comme ceci:

enter image description here

L'activité d'Un ma maison est une activité où je reviens après chaque processus ou flux.
L'activité B est une simple confirmation de l'activité.
Activité C est une autre confirmation de l'activité.
Activité D ne certains processus et, enfin, qu'il obtient en retour le résultat de ma maison de l'activité (Activité).

Exigences:

Activité B anc C:

  • doit être là et ne peuvent pas être fusionnés en un seul.
  • quand il est cliqué sur le bouton annuler il appelle finish() et ne fait rien.
  • quand il est cliqué sur le bouton OK il suit le flux et le courant de l'activité des appels finish()

Question:

Je pensais à l'aide de startActivityForResult() mais je ne l'ai jamais utilisé pour passer d'un résultat à travers de multiples activités..
Je pensais passer un gestionnaire (créé en Activité) qui appelle une méthode sur l'Activité et est exécuté sur l'Activité D...

Comment pourrais-je mettre en œuvre?

62voto

NickT Points 14155

Vous pourriez faire usage de l'intention drapeau FLAG_ACTIVITY_FORWARD_RESULT comme décrit dans l'Intention lors du démarrage des activités de B et de C

public static final int FLAG_ACTIVITY_FORWARD_RESULT Depuis: l'API de Niveau 1

Si elle est définie et cette intention est utilisé pour lancer une nouvelle activité à partir d'un existant, la réponse de la cible de l'activité existante sera transférée à la nouvelle activité. De cette façon, la nouvelle activité peut appeler setResult(int) et le résultat renvoyé à la réponse de la cible de l'activité d'origine.

De cette manière, ce doit ramasser toutes les données envoyées dans les extras envoyé à partir D

10voto

Brian Dupuis Points 5183

Eh oui, très bon formatage. Et vous pouvez et devez probablement appeler certainement startActivityForResult() de chacune des activités A, B et C (et ne le faites pas finish() tout de suite). En B et C, vous pouvez rechercher un résultat positif et finish() , en renvoyant le résultat à A.

     @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if((resultCode == RESULT_OK) && (requestCode == MY_RESULT_CODE)) {
        setResult(RESULT_OK, data);
        finish();
    }
}
 

Si vous voulez que B et C disparaissent malgré tout, procédez comme suit:

     @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    setResult(resultCode, data);
    finish();
}
 

1voto

Dmytro Danylyk Points 6911

+1 pour la mise en forme.

Je voudrais utiliser Singleton pattern pour contenir les données et d'avoir accès global à elle. Et dans les activités que vous pouvez remplacer onResume méthode pour mettre à jour les données sur votre écran ou de faire qch d'autre.

Exemple:

enum DataHolder
{
 INSTANCE;

 private String data;

 public String getData()
 {
  return data;
 {

 public void saveData(String data)
 {
  this.data = data;
 }
}

Utilisation:

DataHolder holder = DataHolder.INSTANCE;
holder.saveData("hello");
holder.getData();

-2voto

Heiko Rupp Points 15153

Vous pouvez faire B et C en tant que dialogues qui sont déclenchés de A et seulement si B et C sont ok, vous exécutez D avec startActivityForResult()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X