J'ai deux activités: l'activité principale et l'activité des enfants.
Lorsque j'appuie sur un bouton de 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 jette des exceptions d'exécution.
Existe-t-il une solution à ça?
Selon les circonstances, il y a plusieurs façons de réaliser ce que vous voulez.
Le scénario le plus courant (ce à quoi vous ressemblez) est celui où une activité enfant est utilisée pour obtenir une entrée de l'utilisateur, telle que la sélection d'un contact dans une liste ou la saisie de données dans une boîte de dialogue. Dans ce cas, vous devez utiliser startActivityForResult
pour lancer l'activité de votre 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 qui sont renvoyées à l'activité appelante.
Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data");
setResult(Activity.RESULT_OK, resultIntent);
finish();
Pour accéder aux données renvoyées dans l'activité appelante, remplacez onActivityResult
. Le requestCode correspond à l'entier transmis dans l'appel startActivityForResult
, alors que le resultCode et les données 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.
String returnValue = data.getStringExtra("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 la fermer, procédez comme suit:
Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();
L'activité 1 - en revenant de l'activité précédente appelle 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);
}
}
UPDATE: Réponse au commentaire de Seenu69, dans l'activité deux,
int result = Integer.parse(EditText1.getText().toString())
+ Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);
Puis dans l'activité un,
int result = data.getExtra(KEY_RESULT);
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.
startActivityForResult
en lui fournissant un code de résultat arbitraire.onActivityResult
. Ceci est appelé à la fin de la deuxième activité. Vous pouvez vous assurer qu'il s'agit bien de la deuxième activité en vérifiant le code de la demande. (Ceci est utile lorsque vous démarrez plusieurs activités différentes à partir de la même activité principale.)Intent
. 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 String data from Intent
String returnString = data.getStringExtra("keyName");
// Set text view with string
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText(returnString);
}
}
}
}
Intent
. Les données sont stockées dans Intent
à l'aide d'une paire clé-valeur.RESULT_OK
et ajoutez l’intention contenant vos données.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);
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();
}
}
RESULT_OK
. Utilisez simplement le nom complet: Activity.RESULT_OK
.FirstActivity utilise startActivityForResult:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 2
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 2)
{
String message=data.getStringExtra("MESSAGE");
}
}
Sur SecondActivity, appelez les événements onClick setResult () ou onBackPressed ()
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(2,intent);
Appelez l'intention de l'activité enfant à l'aide de l'appel de la méthode startActivityForResult ()
Voici un exemple de ceci: http://developer.Android.com/training/notepad/notepad-ex2.html
et dans la section "Retour d'un résultat à partir d'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 String 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) {
String strMessage = data.getStringExtra("keyName");
Log.i(TAG, "onActivityResult: message >>" + strMessage);
}
}
}
}
Et voici SecondActivity.Java
public class SecondActivity extends AppCompatActivity {
private static final String 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) {
String message = editText.getEditableText().toString();
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 startActivityForResult()
, puis obtenir le résultat de la deuxième activité après son utilisation de 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 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.class
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();
}
}
Il y a plusieurs façons de le faire ... 1. en utilisant startActivityForResult (), ce qui est très bien expliqué dans les réponses ci-dessus.
en créant les variables statiques dans votre classe "Utils" ou dans une autre classe de votre choix. Par exemple, je souhaite transmettre studentId d’ActivityB à ActivityA. Tout d’abord, mon ActivityA appelle l’ActivityB. Ensuite, dans ActivityB, définissez studentId (qui est un champ statique dans Utils.class) . Comme ceci, Utils.STUDENT_ID = "1234"; ensuite, en revenant à ActivityA, utilisez studentId qui est stocké dans Utils.STUDENT_ID.
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 String studentId="";
public static MyApplication getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public void setStudentId(String studentID){
this.studentId=studentID;
}
public String 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 être revenu à ActivityA, récupérez les données.
Utilisez sharedPreferences et enregistrez vos données et accédez-les où que vous soyez dans l'application.
enregistrer la date comme ça
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
Et recevoir des données comme celle-ci
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String savedPref = sharedPreferences.getString(key, "");
mOutputView.setText(savedPref);
Toutes ces réponses expliquent que le scénario de votre deuxième activité doit être terminé après l'envoi des données.
Mais si vous ne souhaitez pas terminer la deuxième activité et que vous souhaitez renvoyer les données en premier, vous pouvez utiliser BroadCastReceiver.
En deuxième activité -
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
En première activité-
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
Enregistrez le destinataire dans onCreate () -
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
Annuler son enregistrement dans onDestroy ()