1063 votes

Comment gérer startActivityForResult sur Android ?

Dans mon activité, j'appelle une deuxième activité à partir de l'activité principale par startActivityForResult . Dans ma deuxième activité, il y a quelques méthodes qui terminent cette activité (peut-être sans résultat), cependant, une seule d'entre elles renvoie un résultat.

Par exemple, à partir de l'activité principale, j'en appelle une deuxième. Dans cette activité, je vérifie certaines caractéristiques d'un combiné, par exemple s'il possède une caméra. S'il n'en a pas, je ferme cette activité. De même, pendant la préparation de MediaRecorder o MediaPlayer si un problème survient, je fermerai cette activité.

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

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

2602voto

Nishant Points 10524

De votre FirstActivity appelez le SecondActivity en utilisant le startActivityForResult() méthode.

Par exemple :

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

Dans votre SecondActivity Définissez les données que vous voulez retourner en arrière. FirstActivity . Si vous ne voulez pas revenir en arrière, n'en mettez pas.

Par exemple : Sur SecondActivity si vous voulez renvoyer des données :

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

Si vous ne voulez pas retourner les données :

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

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

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

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

Pour mettre en œuvre le passage de données entre deux activités d'une manière beaucoup plus efficace en Kotlin, veuillez consulter le document suivant ' Une meilleure façon de transmettre des données entre les activités ' .

2 votes

Quel est le but de mettre une intention lorsque RESUT_CANCELLED dans setResult(RESULT_CANCELED, returnIntent) ;

4 votes

@ismail Supposons que dans le SecondActivity une exception s'est produite, dans ce cas, vous devez également renvoyer le résultat à l'utilisateur. FirstActivity ,ainsi vous pouvez définir le résultat comme "RESULT_CANCELLED" dans le bloc de capture et retourner à FirstActivty et en FirstActivity's' 'onActivityResult() vous pouvez vérifier si vous avez obtenu un résultat positif ou négatif.

13 votes

Donc c'est à vous de voir, si vous n'avez pas besoin de connaître la raison de l'annulation, vous pouvez utiliser simplement setResult(RESULT_CANCELED) ; sans aucune intention.

54voto

Sam Points 47925

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

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

  • requestCode identifie l'application qui a renvoyé ces résultats. C'est vous qui le définissez lorsque vous appelez startActivityForResult() .
  • resultCode vous informe si cette application a réussi, échoué, ou quelque chose de différent
  • data contient toute information renvoyée par cette application. Cela peut être null .

0 votes

Cela signifie que le requestCode n'est utilisé que dans la première activité, et qu'il n'est jamais utilisé pour la deuxième activité ? Si la deuxième activité a une approche différente, elle changera, mais en se basant sur les extras de l'intention et non sur le requestCode, n'est-ce pas ? Edit : Oui, stackoverflow.com/questions/5104269/

52voto

Suragch Points 197

Exemple

Pour voir l'ensemble du processus dans son contexte, voici une réponse complé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);
            }
        }
    }
}

DeuxièmeActivité.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();
    }
}

48voto

Julian Alberto Points 566

Complément d'information la réponse de Nishant le meilleur moyen de renvoyer le résultat de l'activité est de le faire :

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

J'avais un problème avec

new Intent();

Puis j'ai découvert que la bonne façon de faire est d'utiliser

getIntent();

pour obtenir l'intention actuelle.

25voto

Sanjayrajsinh Points 1098

startActivityForResult : Déprécié dans Android X

Pour le nouveau la façon dont nous avons registerForActivityResult .

En Java :

 // You need to create a launcher variable inside onAttach or onCreate or global, i.e, before the activity is displayed
 ActivityResultLauncher<Intent> launchSomeActivity = registerForActivityResult(
     new ActivityResultContracts.StartActivityForResult(),
     new ActivityResultCallback<ActivityResult>() {
              @Override
              public void onActivityResult(ActivityResult result) {
                   if (result.getResultCode() == Activity.RESULT_OK) {
                         Intent data = result.getData();
                         // your operation....
                    }
               }
      });

      public void openYourActivity() {
            Intent intent = new Intent(this, SomeActivity.class);
            launchSomeActivity.launch(intent);
      }

Dans Kotlin :

var resultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data: Intent? = result.data
        // your operation...
    }
}

fun openYourActivity() {
    val intent = Intent(this, SomeActivity::class.java)
    resultLauncher.launch(intent)
}

Avantage :

  1. La nouvelle méthode permet de réduire la complexité à laquelle nous étions confrontés lorsque nous appelions l'activité à partir d'un fragment ou d'une autre activité.
  2. Demandez facilement n'importe quelle permission et obtenez un rappel.

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