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é il y a quelques méthodes qui terminent cette activité (peut-être sans résultat), cependant, un seul d'entre eux renvoie un résultat.

par exemple, de l'activité principale je l'appelle un deuxième. Dans cette activité, je vérifie certaines caractéristiques du combiné, comme s'il a une caméra. Si ce n'est pas le cas, je vais fermer cette activité. Aussi, lors de la préparation de MediaRecorder ou MediaPlayer si un problème se produit alors je vais fermer cette activité.

Si son appareil dispose d'une caméra et l'enregistrement est fait, complètement, puis, après l'enregistrement d'une vidéo si un utilisateur clique sur le bouton terminé, alors je vais envoyer le résultat (l'adresse de la vidéo enregistrée) retour à l'activité principale.

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

806
demandé sur Jonik 2012-05-02 07:03:00

9 réponses

à Partir de votre FirstActivity appel SecondActivity à l'aide startActivityForResult() méthode

par exemple:

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

dans votre SecondActivity définissez les données que vous voulez retourner à FirstActivity . Si vous ne voulez pas revenir, n'en mettez pas.

par exemple: en secondactivité 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 classe de première activité é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
2122
répondu Nishant 2017-09-12 12:29:59

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

vous devez remplacer Activity.onActivityResult() puis vérifier ses paramètres:

  • requestCode identifie l'application qui a retourné ces résultats. Ceci est défini par vous lorsque vous appelez startActivityForResult() .
  • resultCode vous informe si cette application a réussi, échoué, ou quelque chose de différent
  • data contient toute information retournée par cette application. Cela peut être null .
41
répondu Sam 2014-05-13 05:03:27

en complément de la réponse de @Nishant, la meilleure façon de retourner le résultat de l'activité est:

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 est d'utiliser

getIntent();

pour obtenir l'intention actuelle

31
répondu Julian Alberto Piovesan Ruiz D 2015-05-26 20:40:47

exemple

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

enter image description here

activité principale.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);
            }
        }
    }
}

Secondactivité.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();
    }
}
23
répondu Suragch 2018-01-17 17:50:33

si vous voulez mettre à jour l'interface utilisateur avec le résultat de l'activité, vous ne pouvez pas utiliser this.runOnUiThread(new Runnable() {} En faisant cela, L'interface utilisateur ne se rafraîchira pas avec une 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 stupide mais fonctionne assez bien.

9
répondu DaviF 2014-03-08 13:54:56

pour ceux qui ont un problème avec wrong requestCode in onActivityResult

si vous appelez startActivityForResult() de votre Fragment , le code de demande est modifié par L'activité qui possède le Fragment.

si vous voulez obtenir le code de résultat correct dans votre activité essayez ceci:

changement:

startActivityForResult(intent, 1); à:

getActivity().startActivityForResult(intent, 1);

9
répondu Tomasz Mularczyk 2017-05-23 12:34:53

tout d'abord vous utilisez startActivityForResult() avec les paramètres dans la première Activity et si vous voulez envoyer des données de la deuxième Activity à la première Activity puis passer la valeur en utilisant Intent avec setResult() méthode et obtenir ces données dans onActivityResult() méthode dans la première Activity .

2
répondu Dharmendra Pratap 2015-04-20 11:57:38

problème très courant dans android

il peut être décomposé en 3 morceaux

" 1) Démarrer L'activité B (se produit dans L'activité a)

2 ) Définissez les données demandées (qui se Passe dans l'activité B)

3) recevoir les données demandées (se passe dans l'activité a)

1) activitécommerciale b

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

2 )Ensemble des données demandées

Dans cette partie, vous décidez si vous souhaitez transmettre des données ou pas lorsqu'un événement particulier se produit.

Par exemple: dans l'activité B, Il y a un texte électronique et deux boutons b1, b2.

Cliquer sur le bouton b1 renvoie les données à activity A

Cliquer sur le bouton b2 n'envoie aucune donnée.

Envoi des 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();
    }

clics de l'utilisateur Retour bouton

Par défaut, le résultat est défini avec l'Activité.RESULT_CANCEL code de réponse

3) retrieve result

Pour remplacer la 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 
}
}
0
répondu Rohit Singh 2017-12-22 09:54:47

l'anwser de @Nishant est correct. Dans mon cas, onActivityResult n'a jamais été appelé à cause des paramètres dans AndroidManifest. Assurer votre deuxième activité (ou de l'expéditeur) n'a pas mis cette ligne dans le Manifeste Android.

<activity android:name=".SecondViewActivity"
            android:parentActivityName=".FirstActivity"/>

si oui, veuillez supprimer android:parentActivityName=".FirstActivity"

-2
répondu Catluc 2018-02-27 12:26:46