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

128

J'ai une Locationactivité qui peut être appelée à partir de nombreuses activités, telles que Sign upet Order. Dans l' Locationactivité, l'utilisateur entre son emplacement, donc l'activité Locationretournera ce nouvel emplacement à l'activité qui l'a appelé.

Ainsi, lorsque l' Sign upactivité appelle l' Locationactivité, elle doit renvoyer les données à l' Sign upactivité. Une autre fois, l' Orderactivité fera la même chose.

Remarque

Je sais que vous me direz que je devrais afficher le code, mais je ne vous demande pas de me donner le code; Je veux juste quelques conseils, liens ou bons fils.

utilisateur utilisateur
la source
vous pouvez utiliser le call to back de finish () ..
Harshid
1
Avez-vous vérifié StartActivityForResult developer.android.com/reference/android/app/Activity.html
vinaykumar
@Harshid pourriez-vous me donner plus de détails s'il vous plaît, ou si vous avez des liens qui seraient appréciés
utilisateur utilisateur

Réponses:

253

Afin de démarrer une activité qui devrait renvoyer le résultat de l'activité d'appel, vous devez faire quelque chose comme ci-dessous. Vous devez passer le code de demande comme indiqué ci-dessous afin d'identifier que vous avez obtenu le résultat de l'activité que vous avez commencée.

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

Dans l'activité, vous pouvez utiliser setData()pour renvoyer 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();

Alors là encore, dans la première activité, vous écrivez le code ci-dessous 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();
        }
    }
}

MODIFIER en fonction de votre commentaire: si vous souhaitez renvoyer trois chaînes, suivez ceci 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();

Obtenez-les dans 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");
        }
    }
}
Kanth
la source
que dites-vous? Je ne comprends pas votre dernier commentaire, désolé je ne suis pas bon anglais, j'essaye votre code maintenant, qu'est-ce que requestcodeje peux mettre un entier?
utilisateur utilisateur
1
J'ai dit, No Problems (NP) et comme vous l'avez dit que vous pourriez être en retard dans la mise en œuvre de cela, j'ai répondu que de prendre votre temps et de le commenter afin que je puisse être informé. En venant à requestcode, oui, vous pouvez donner une valeur entière comme int requestCode = 1;
Kanth
oui ça marche bien, j'accepte votre réponse, merci beaucoup, je veux vous demander s'il y a un moyen de ne pas simplement envoyer une chaîne, je veux envoyer 3 chaînes, comme "city", "street", " home ", il existe un moyen d'étiqueter les chaînes?
utilisateur utilisateur
votre réponse est très excellente, si vous le souhaitez, modifiez le titre afin que de nombreux utilisateurs puissent le rechercher
utilisateur utilisateur
Je cherchais comment créer l'intention : new Intent(this, OtherActivity.class);je peux utiliser ce code dans une activité.
Utilisateur
3

Si vous souhaitez terminer et ajouter simplement 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 nous allons 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).

lenooh
la source
4
la valeur de Activity.RESULT_OKest en fait -1, au cas où cela dérouterait quelqu'un. Je suggérerais simplement d'utiliser les Activityconstantes
jacoballenwood