web-dev-qa-db-fra.com

En utilisant startActivityForResult, comment obtenir requestCode dans une activité enfant?

J'ai quatre activités, par exemple A, B, C et D. Ma situation est A commencera l'activité B par startActivityForResult.

startActivityForResult(new Intent(this,B.class),ONE);

Dans une autre situation je vais B avec une autre situation. comme

 startActivityForResult(new Intent(this,B.class),TWO);

En B, je dois appeler C ou D en fonction de requestCode. Ie si ON doit commencer C sinon D.
J'ai donc besoin de savoir comment vérifier le requestCode dans l'activité enfant (B ici).
En d’autres termes, je souhaite obtenir le code de demande par lequel l’activité B a démarré.

79
Jithin

Vous pouvez transmettre le code de demande en mettant extra.

intent.putExtra("requestCode", requestCode);   

Ou si vous avez utilisé startActivityForResult plusieurs fois, alors mieux que de les éditer, vous pouvez override le startActivityForResult dans votre Activity, ajoutez-y votre code comme ceci

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

Il n'est donc pas nécessaire de modifier tous vos startActivityForResult
J'espère que ça vous a aidé

126
Labeeb Panampullan

Le code de demande n'est pas transmis automatiquement à l'activité démarrée car il n'a pas (et ne devrait pas) avoir besoin de connaître cette valeur. Il a seulement besoin de savoir quoi faire et pas d'où il a été commencé.

Commencer une activité n'est en réalité qu'une autre forme d'appeler une méthode. Lorsque vous appelez une méthode, vous recevez le résultat de manière synchrone (là où vous avez passé l'appel). Dans ce cas, vous ne transmettez que les informations dont la méthode a besoin pour faire son travail. Vous ne dites pas d'où vous l'avez appelé.

Le démarrage d'une activité est l'analogue asynchrone de l'appel d'une méthode. Dans ce cas, vous recevez le résultat dans la méthode spéciale onActivityResult (). Dans cette méthode, vous devez savoir quoi faire avec le résultat que vous venez de recevoir et vous avez le code de demande pour cela.

Pour expliquer un peu plus pourquoi il n’est pas judicieux de passer le code de demande en tant que paramètre, considérons l’exemple d’activité qui montre un produit que vous pouvez acheter. Sur cette activité, deux boutons intitulés "Acheter" et "Connexion" (étant donné que vous n'êtes actuellement pas connecté). En appuyant sur "Connexion", une activité nommée "Connexion" va démarrer pour essayer de connecter l'utilisateur à l'aide des informations fournies. En appuyant sur "Acheter", vous commencerez par la même activité "Connexion" et, si la connexion a abouti, démarrez l'activité d'achat.

Désormais, le bouton "Connexion" utilise le code de demande 1 pour démarrer l'activité de connexion, mais le bouton "Acheter" ne peut pas utiliser le même code de demande, car il devra faire quelque chose de différent si la connexion aboutit. Ainsi, le bouton "Acheter" utilise le code de requête 2.

Dans l'activité "Connexion", vous pouvez recevoir deux codes de demande différents selon l'endroit d'où il a été appelé, mais vous devrez suivre la même procédure.

Donc, si vous transmettez le code de requête en tant que paramètre, vous obtiendrez un code qui doit faire la même chose pour deux codes de requête différents, tels que:

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

Vous finirez également par stocker les constantes de code de demande dans un emplacement central, par exemple. une classe nommée RequestCodes.

En bref, le code de demande ne devrait être utilisé que pour décider quoi faire du résultat reçu. De cette façon, vous obtiendrez un code plus modulaire, plus facile à maintenir et plus facile à étendre.

25
Szabolcs Berecz

J'ai finalement utilisé l'action d'intention personnalisée pour transmettre ce type d'informations à l'activité de lancement.

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

Alors tu irais comme:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

Et dans l'activité B vous obtenez l'action facilement:

getIntent().getAction();
7
Marcel Bro

Vous pouvez utiliser getCallingActivity () pour obtenir l'activité qui a démarré l'activité en cours et qui recevra la valeur de résultat avec le code de réponse à la fin.

0
Moaz Rashad