Envoi de données à l’activité principale dans Android

J’ai deux activités: l’activité principale et l’activité de l’enfant.
Lorsque j’appuie sur un bouton dans l’activité principale, l’activité enfant est lancée.

Maintenant, je veux envoyer des données à l’écran principal. J’ai utilisé la classe Bundle, mais cela ne fonctionne pas. Il génère des exceptions d’exécution.

Existe-t-il une solution à ça?

Il y a plusieurs façons de réaliser ce que vous voulez, selon les circonstances.

Le scénario le plus courant (qui ressemble à ce que vous pensez) concerne le moment où une activité enfant est utilisée pour obtenir une entrée utilisateur, par exemple pour choisir un contact dans une liste ou saisir des données dans une boîte de dialog. Dans ce cas, vous devez utiliser startActivityForResult pour lancer votre activité enfant.

Cela fournit un pipeline pour renvoyer des données à l’activité principale à l’aide de setResult . La méthode setResult prend une valeur de résultat int et une intention renvoyée à l’activité appelante.

 Intent resultIntent = new Intent(); // TODO Add extras or a data URI to this intent as appropriate. resultIntent.putExtra("some_key", "Ssortingng data"); setResult(Activity.RESULT_OK, resultIntent); finish(); 

Pour accéder aux données renvoyées dans l’activité d’appel, substituez onActivityResult . Le requestCode correspond à l’entier passé dans l’appel startActivityForResult , tandis que resultCode et Data Intent sont renvoyés par l’activité enfant.

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch(requestCode) { case (MY_CHILD_ACTIVITY) : { if (resultCode == Activity.RESULT_OK) { // TODO Extract the data returned from the child Activity. Ssortingng returnValue = data.getSsortingngExtra("some_key"); } break; } } } 

L’activité 1 utilise startActivityForResult :

 startActivityForResult(ActivityTwo, ActivityTwoRequestCode) 

L’activité 2 est lancée et vous pouvez effectuer l’opération, pour fermer l’activité, procédez comme suit:

 Intent output = new Intent(); output.putExtra(ActivityOne.Number1Code, num1); output.putExtra(ActivityOne.Number2Code, num2); setResult(RESULT_OK, output); finish(); 

Activité 1 – le retour de l’activité précédente appellera onActivityResult :

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) { num1 = data.getIntExtra(Number1Code); num2 = data.getIntExtra(Number2Code); } } 

MISE À JOUR: Réponse au commentaire de Seenu69, dans l’activité deux,

 int result = Integer.parse(EditText1.getText().toSsortingng()) + Integer.parse(EditText2.getText().toSsortingng()); output.putExtra(ActivityOne.KEY_RESULT, result); 

Puis en activité un,

 int result = data.getExtra(KEY_RESULT); 

Envoi de données Retour

Cela m’aide à voir les choses dans leur contexte. Voici un projet simple et complet pour renvoyer des données. Plutôt que de fournir les fichiers de mise en page XML, voici une image.

entrer la description de l'image ici

Activité principale

  • Démarrez la deuxième activité avec startActivityForResult , en lui fournissant un code de résultat arbitraire.
  • Remplacer onActivityResult . Ceci est appelé lorsque la deuxième activité se termine. Vous pouvez vous assurer que c’est bien la deuxième activité en vérifiant le code de résultat. (Ceci est utile lorsque vous démarrez plusieurs activités différentes à partir de la même activité principale.)
  • Extrayez les données que vous avez obtenues à partir de l’ Intent retour. Les données sont extraites à l’aide d’une paire clé-valeur.

MainActivity.java

 public class MainActivity extends AppCompatActivity { 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) { // get Ssortingng data from Intent Ssortingng returnSsortingng = data.getSsortingngExtra("keyName"); // set text view with ssortingng TextView textView = (TextView) findViewById(R.id.textView); textView.setText(returnSsortingng); } } } } 

Deuxième activité

  • Placez les données que vous souhaitez renvoyer à l’activité précédente dans une Intent . Les données sont stockées dans Intent utilisant une paire clé-valeur.
  • Définissez le résultat sur RESULT_OK et ajoutez l’intention contenant vos données.
  • Appelez finish() pour fermer la deuxième activité.

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); Ssortingng ssortingngToPassBack = editText.getText().toSsortingng(); // put the Ssortingng to pass back into an Intent and close this activity Intent intent = new Intent(); intent.putExtra("keyName", ssortingngToPassBack); setResult(RESULT_OK, intent); finish(); } } 

Autres notes

  • Si vous êtes dans un fragment, il ne connaîtra pas la signification de RESULT_OK . Utilisez simplement le nom complet: Activity.RESULT_OK .

Voir également

  • Réponse plus complète incluant le transfert des données
  • Conventions de dénomination de la chaîne de clé

En première activité, utilisez startActivityForResult:

 Intent intent=new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent, int resultCode); //suppose resultCode == 2; // Call Back method to get the Message form other Activity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==2) { Ssortingng message=data.getSsortingngExtra("MESSAGE"); } } 

Sur SecondActivity, appelez setResult () sur les événements click ou sur backPressed ()

  Intent intent=new Intent(); intent.putExtra("MESSAGE",message); setResult(2,intent); 

Appelez l’activité enfant Intention à l’aide de l’appel de la méthode startActivityForResult ()

Il y a un exemple de ceci ici: http://developer.android.com/training/notepad/notepad-ex2.html

et dans le “Retour d’un résultat depuis un écran” de ceci: http://developer.android.com/guide/faq/commontasks.html#opennewscreen

J’ai créé un cours de démonstration simple pour votre meilleure référence.

FirstActivity.java

  public class FirstActivity extends AppCompatActivity { private static final Ssortingng TAG = FirstActivity.class.getSimpleName(); private static final int REQUEST_CODE = 101; private Button btnMoveToNextScreen; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext); btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class); startActivityForResult(mIntent, REQUEST_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode == RESULT_OK){ if(requestCode == REQUEST_CODE && data !=null) { Ssortingng strMessage = data.getSsortingngExtra("keyName"); Log.i(TAG, "onActivityResult: message >>" + strMessage); } } } } 

Et voici SecondActivity.java,

 public class SecondActivity extends AppCompatActivity { private static final Ssortingng TAG = SecondActivity.class.getSimpleName(); private Button btnMoveToPrevious; private EditText editText; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); editText = (EditText) findViewById(R.id.editText); btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious); btnMoveToPrevious.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Ssortingng message = editText.getEditableText().toSsortingng(); Intent mIntent = new Intent(); mIntent.putExtra("keyName", message); setResult(RESULT_OK, mIntent); finish(); } }); } } 

Dans la première activité, vous pouvez envoyer une intention à l’aide de startActivityForResultand() , puis obtenir le résultat de l’activité secound après avoir fini d’utiliser setResult .

MainActivity.class

 public class MainActivity extends AppCompatActivity { private static final int SECOND_ACTIVITY_RESULT_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); // send intent for result startActivityForResult(intent, SECOND_ACTIVITY_RESULT_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_RESULT_CODE) { if (resultCode == RESULT_OK) { // get Ssortingng data from Intent Ssortingng returnSsortingng = data.getSsortingngExtra("keyName"); // set text view with ssortingng TextView textView = (TextView) findViewById(R.id.textView); textView.setText(returnSsortingng); } } } } 

========= activité secondaire

 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); Ssortingng ssortingngToPassBack = editText.getText().toSsortingng(); // put the Ssortingng to pass back into an Intent and close this activity Intent intent = new Intent(); intent.putExtra("keyName", ssortingngToPassBack); setResult(RESULT_OK, intent); finish(); } } 

Utilisez sharedPreferences et enregistrez vos données et accédez-y depuis n’importe où dans l’application

enregistrer la date comme ça

 SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putSsortingng(key, value); editor.commit(); 

Et recevoir des données comme ça

 SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); Ssortingng savedPref = sharedPreferences.getSsortingng(key, ""); mOutputView.setText(savedPref); 

Il y a des façons de le faire. 1. en utilisant le startActivityForResult () qui est très bien expliqué dans les réponses ci-dessus.

  1. en créant les variables statiques dans votre classe “Utils” ou toute autre classe de votre choix. Par exemple, je veux transmettre studentId d’ActiveB à ActivityA. Premièrement, mon ActivityA appelle le ActivityB. Ensuite, dans ActivityB, définissez le paramètre studentId (qui est un champ statique dans Utils.class). Comme ceci Utils.STUDENT_ID = “1234”; puis, en revenant à ActivityA, utilisez le studentId qui est stocké dans Utils.STUDENT_ID.

  2. en créant une méthode getter et setter dans votre classe d’application.

comme ça:

 public class MyApplication extends Application { private static MyApplication instance = null; private Ssortingng studentId=""; public static MyApplication getInstance() { return instance; } @Override public void onCreate() { super.onCreate(); instance = this; } public void setStudentId(Ssortingng studentID){ this.studentId=studentID; } public Ssortingng getStudentId(){ return this.studentId; } } 

alors vous avez terminé. Il suffit de définir les données à l’intérieur lorsque vous êtes dans ActivityB et après avoir renvoyé à ActivityA, récupérez les données.

Juste un petit détail qui, selon moi, manque dans les réponses ci-dessus.

Si votre activité enfant peut être ouverte à partir de plusieurs activités parent, vous pouvez vérifier si vous devez ou non setResult , selon que votre activité a été ouverte par startActivity ou startActivityForResult . Vous pouvez y parvenir en utilisant getCallingActivity() . Plus d’infos ici .