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?
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
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érentdata
contient toutes les informations renvoyées par cette application. Cela peut être null
.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
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.
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();
}
}
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);
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.
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
.
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
}
}
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{
}
}