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?
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
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 appelezstartActivityForResult()
. -
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 êtrenull
.
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
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.
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();
}
}
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.
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);
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
.
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
}
}
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"