web-dev-qa-db-fra.com

Comment gérer startActivityForResult sur Android?

Dans mon activité, j'appelle une deuxième activité de l'activité principale par startActivityForResult. Dans ma deuxième activité, certaines méthodes terminent cette activité (peut-être sans résultat). Cependant, une seule d'entre elles renvoie un résultat.

Par exemple, depuis l'activité principale, j'en appelle une seconde. Dans cette activité, je vérifie certaines fonctionnalités du combiné, telles que son appareil photo. Si ce n'est pas le cas, je fermerai cette activité. De plus, lors de la préparation de MediaRecorder ou MediaPlayer si un problème survient, je ferme cette activité.

Si son appareil dispose d'une caméra et que l'enregistrement est complètement terminé, après l'enregistrement d'une vidéo si l'utilisateur clique sur le bouton Terminé, le résultat (l'adresse de la vidéo enregistrée) est renvoyé à l'activité principale.

Comment puis-je vérifier le résultat de l'activité principale?

910
Hesam

Depuis votre FirstActivity appelez le SecondActivity en utilisant la méthode startActivityForResult()

Par exemple:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

Dans votre SecondActivity, définissez les données que vous souhaitez renvoyer sur FirstActivity. Si vous ne voulez pas revenir, n'en définissez pas.

Par exemple: Dans SecondActivity si vous souhaitez renvoyer des données:

Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

Si vous ne souhaitez pas renvoyer de données:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Maintenant, dans votre classe FirstActivity, écrivez le code suivant pour la méthode onActivityResult().

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//onActivityResult
2323
Nishant

Comment vérifier le résultat de l'activité principale?

Vous devez remplacer Activity.onActivityResult() puis vérifiez ses paramètres:

  • requestCode identifie quelle application a renvoyé ces résultats. Ceci est défini par vous lorsque vous appelez startActivityForResult().
  • resultCode vous informe si cette application a réussi, a échoué ou quelque chose de différent
  • data contient toutes les informations renvoyées par cette application. Cela peut être null.
47
Sam

En complément de la réponse de @ Nishant, le meilleur moyen de renvoyer le résultat de l'activité est:

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

J'avais des problèmes avec

new Intent();

Ensuite, j'ai découvert que la bonne façon utilise

getIntent();

pour obtenir l'intention actuelle

42
Julian Alberto

Exemple

Pour voir le processus entier dans son contexte, voici une réponse supplémentaire. Voir ma réponse plus complète pour plus d'explications.

enter image description here

MainActivity.Java

public class MainActivity extends AppCompatActivity {

    // Add a different request code for every activity you are starting from here
    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) { // Activity.RESULT_OK

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.Java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}
40
Suragch

Pour ceux qui ont un problème avec mauvais requestCode dans onActivityResult

Si vous appelez startActivityForResult() depuis votre Fragment, le requestCode est modifié par l'activité qui possède le fragment.

Si vous voulez obtenir le résultat correct dans votre activité, essayez ceci:

Changement:

startActivityForResult(intent, 1); À:

getActivity().startActivityForResult(intent, 1);

11
Tomasz Mularczyk

Si vous souhaitez mettre à jour l'interface utilisateur avec le résultat de l'activité, vous ne pouvez pas utiliser this.runOnUiThread(new Runnable() {} Cette opération n'actualisera pas l'interface utilisateur avec la nouvelle valeur. Au lieu de cela, vous pouvez faire ceci:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_CANCELED) {
        return;
    }

    global_lat = data.getDoubleExtra("LATITUDE", 0);
    global_lng = data.getDoubleExtra("LONGITUDE", 0);
    new_latlng = true;
}

@Override
protected void onResume() {
    super.onResume();

    if(new_latlng)
    {
        PhysicalTagProperties.this.setLocation(global_lat, global_lng);
        new_latlng=false;
    }
}

Cela semble idiot mais fonctionne plutôt bien.

10
DaviF

Tout d'abord, vous utilisez startActivityForResult() avec des paramètres dans le premier Activity et si vous souhaitez envoyer des données du second Activity au premier Activity, puis transmettez la valeur à l'aide de Intent avec setResult() et obtenez ces données dans onActivityResult(), méthode en premier Activity.

2
Dharmendra Pratap

Problème très courant sous Android
Il peut être divisé en 3 morceaux
1) Commencez l’activité B (se passe dans l’activité A)
2) Définir les données demandées (se produit dans l'activité B)
3) Recevoir les données demandées (se produit dans l'activité A)

1) startActivity B

Intent i = new Intent(A.this, B.class);
startActivity(i);

2) Définir les données demandées

Dans cette partie, vous décidez si vous souhaitez renvoyer des données ou non lorsqu'un événement particulier se produit.
Exemple: dans l'activité B, il y a un EditText et deux boutons b1, b2.
Un clic sur le bouton b1 renvoie les données à l'activité A
Un clic sur le bouton b2 n’envoie aucune donnée.

Envoi de données

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

ne pas envoyer de données

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

l'utilisateur clique sur le bouton retour
Par défaut, le résultat est défini avec le code de réponse Activity.RESULT_CANCEL.

3) Récupérer le résultat

Pour cette méthode onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RES_CODE_A) {

     // b1 was clicked 
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked 
}
}
1
Rohit Singh
You need to override Activity.onActivityResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == RESULT_CODE_ONE) {


   String a = data.getStringExtra("RESULT_CODE_ONE");

}
else if(resultCode == RESULT_CODE_TWO){

   // b was clicked

}
else{

}
}
0
Nitesh Dev Kunwar