Question Comment gérer `startActivityForResult` sur Android?


Dans mon activité, j'appelle une deuxième activité de l'activité principale startActivityForResult. Dans ma deuxième activité il y a quelques méthodes qui finissent cette activité (peut-être sans résultat), cependant, seulement une d'elles retourne un résultat.

Par exemple, à partir de l'activité principale, j'appelle un second. Dans cette activité, je vérifie certaines caractéristiques du combiné, comme un appareil photo. Si ce n'est pas le cas, je fermerai cette activité. En outre, lors de la préparation de MediaRecorder ou MediaPlayer Si un problème survient, je vais fermer cette activité.

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

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


780
2018-05-02 03:03


origine


Réponses:


De ton FirstActivity appeler le SecondActivity en utilisant startActivityForResult() méthode

Par exemple:

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

Dans ton SecondActivity définir les données que vous souhaitez retourner à FirstActivity. Si vous ne voulez pas revenir, n'en définissez aucun.

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 voulez 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 le onActivityResult() méthode.

@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

2071
2018-05-02 03:36



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 détient toutes les informations retournées par cette application. Cela peut être null.

40
2018-05-02 03:07



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();

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

getIntent();

pour obtenir l'intention actuelle


30
2018-05-26 20:40



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

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

22
2017-12-05 08:36



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 sera pas actualisée avec une nouvelle valeur. Au lieu de cela, vous pouvez le faire:

@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 plutôt bien.


9
2018-03-08 13:54



Pour ceux qui ont des problèmes avec mauvais requestCode dans onActivityResult

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

Si vous voulez obtenir le bon résultatCode dans votre activité, essayez ceci:

Changement:

startActivityForResult(intent, 1); À:

getActivity().startActivityForResult(intent, 1);


9
2017-10-23 12:58



D'abord vous utilisez startActivityForResult() avec des paramètres en premier Activity et si vous voulez envoyer des données de seconde Activity au premier Activity puis passez la valeur en utilisant Intent avec setResult() méthode et obtenir ces données à l'intérieur onActivityResult() méthode en premier Activity.


2
2017-09-30 12:30



Problème très commun dans Android
Il peut être décomposé en 3 pièces
1) Commencer l'activité B (se passe dans l'activité A)
2) Définir les données demandées (Happens in activty B)
3) Recevoir les données demandées (Se produit dans l'activité A)

1) startActivité 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.
Ex: Dans l'activité B il y a un EditText et deux boutons b1, b2.
Cliquer sur le bouton b1 renvoie les données à actvity A
Cliquer 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 de retour
Par défaut, le résultat est défini avec le code de réponse Activity.RESULT_CANCEL

3) Résultat de la reprise

Pour cette méthode override 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
2017-12-22 09:54



La réponse de @Nishant est correcte. Dans mon cas, onActivityResult n'a jamais été appelé en raison des paramètres de AndroidManifest. Assurez-vous que votre deuxième activité (ou l'expéditeur) n'a pas défini cette ligne dans le manifeste Android.

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

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


-1
2018-02-27 12:26