157 votes

Android : comment faire en sorte qu'une activité renvoie les résultats à l'activité qui l'appelle ?

J'ai un Location qui peut être appelée à partir de nombreuses activités, telles que Sign up y Order . Dans le Location activité, l'utilisateur saisit son emplacement, donc l'activité Location retournera ce nouvel emplacement à l'activité qui l'a appelé.

Ainsi, lorsque le Sign up appelle l'activité Location il doit renvoyer les données à l'activité Sign up activité. Une autre fois, le Order l'activité fera la même chose.

Note

Je sais que vous allez me dire que je devrais poster le code, mais je ne vous demande pas de me donner le code ; je veux juste des conseils, des liens ou de bons fils de discussion.

298voto

Appu Points 2572

Afin de lancer une activité qui doit renvoyer le résultat à l'activité appelante, vous devez faire quelque chose comme ci-dessous. Vous devez passer le requestcode comme indiqué ci-dessous afin d'identifier que vous avez obtenu le résultat de l'activité que vous avez lancée.

startActivityForResult(new Intent(“YourFullyQualifiedClassName”),requestCode);

Dans cette activité, vous pouvez utiliser setData() pour retourner le résultat.

Intent data = new Intent();
String text = "Result to be returned...."
//---set the data to pass back---
data.setData(Uri.parse(text));
setResult(RESULT_OK, data);
//---close the activity---
finish();

Ainsi, dans la première activité, vous écrivez le code suivant dans onActivityResult()

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String returnedResult = data.getData().toString();
            // OR
            // String returnedResult = data.getDataString();
        }
    }
}

EDIT en fonction de votre commentaire : Si vous voulez renvoyer trois chaînes de caractères, suivez cette procédure en utilisant des paires clé/valeur avec intention au lieu d'utiliser Uri.

Intent data = new Intent();
data.putExtra("streetkey","streetname");
data.putExtra("citykey","cityname");
data.putExtra("homekey","homename");
setResult(RESULT_OK,data);
finish();

Faites-les entrer onActivityResult comme ci-dessous :

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == request_Code) {
        if (resultCode == RESULT_OK) {
            String street = data.getStringExtra("streetkey");
            String city = data.getStringExtra("citykey");
            String home = data.getStringExtra("homekey");
        }
    }
}

38voto

Mike Grimm Points 138

Mise à jour février 2021

Comme dans Activité v1.2.0 y Fragment v1.3.0 le nouveau Activity Result APIs ont été introduits.

Les API de résultat d'activité fournissent des composants permettant de s'inscrire à un résultat, de lancer le résultat et de traiter le résultat une fois qu'il est envoyé par le système.

Il n'est donc pas nécessaire d'utiliser startActivityForResult y onActivityResult plus.

Pour utiliser la nouvelle API, vous devez créer un ActivityResultLauncher dans votre activité d'origine, en spécifiant le callback qui sera exécuté lorsque l'activité de destination se termine et renvoie les données souhaitées :

private val intentLauncher =
    registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->

        if (result.resultCode == Activity.RESULT_OK) {
            result.data?.getStringExtra("streetkey")
            result.data?.getStringExtra("citykey")
            result.data?.getStringExtra("homekey")
        }
    }

et ensuite, lancer votre intention chaque fois que vous en avez besoin :

intentLauncher.launch(Intent(this, YourActivity::class.java))

Et pour renvoyer les données de l'activité de destination, il suffit d'ajouter une intention avec les valeurs à renvoyer à l'activité de destination. setResult() méthode :

val data = Intent()
data.putExtra("streetkey", "streetname")
data.putExtra("citykey", "cityname")
data.putExtra("homekey", "homename")

setResult(Activity.RESULT_OK, data)
finish()

Pour toute information complémentaire, veuillez vous référer à Documentation Android

5voto

lenooh Points 507

Si vous voulez finir et juste ajouter un resultCode (sans données), vous pouvez appeler setResult(int resultCode) avant finish() .

Par exemple :

...
if (everything_OK) {
    setResult(Activity.RESULT_OK); // OK! (use whatever code you want)
    finish();
}
else {
   setResult(Activity.RESULT_CANCELED); // some error ...
   finish();
}
...

Ensuite, dans votre activité d'appel, vérifiez le resultCode pour voir si tout va bien.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == someCustomRequestCode) {
        if (resultCode == Activity.RESULT_OK) {
            // OK!
        }
        else if (resultCode = Activity.RESULT_CANCELED) {
            // something went wrong :-(
        }
    }
}

N'oubliez pas d'appeler l'activité avec startActivityForResult(intent, someCustomRequestCode) .

1voto

Yornel Marval Points 11

Votre erreur est dans resultCode = Activity.RESULT_CANCELED vous devriez avoir une instance comme resultCode == Activity.RESULT_CANCELED ==

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