Ich habe zwei Aktivitäten: Hauptaktivität und Kinderaktivität.
Wenn ich eine Taste in der Hauptaktivität drücke, wird die untergeordnete Aktivität gestartet.
Nun möchte ich einige Daten zum Hauptbildschirm zurückschicken. Ich habe die Bundle-Klasse verwendet, aber es funktioniert nicht. Es gibt einige Laufzeitausnahmen.
Gibt es dafür eine Lösung?
Je nach den Umständen gibt es mehrere Möglichkeiten, das zu erreichen, was Sie möchten.
Das häufigste Szenario (wie es sich anhört) ist, wenn eine untergeordnete Aktivität verwendet wird, um Benutzereingaben zu erhalten, z. B. das Auswählen eines Kontakts aus einer Liste oder das Eingeben von Daten in ein Dialogfeld. In diesem Fall sollten Sie startActivityForResult
verwenden, um Ihre untergeordnete Aktivität zu starten.
Dies bietet eine Pipeline für das Senden von Daten an die Hauptaktivität mit setResult
. Die setResult-Methode akzeptiert einen int-Ergebniswert und einen Intent, der an die aufrufende Aktivität zurückgegeben wird.
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();
Um auf die zurückgegebenen Daten in der aufrufenden Aktivität zuzugreifen, überschreiben Sie onActivityResult
. Der requestCode entspricht der im startActivityForResult
-Aufruf übergebenen Ganzzahl, während resultCode und data Intent von der untergeordneten Aktivität zurückgegeben werden.
@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;
}
}
}
Aktivität 1 verwendet startActivityForResult :
startActivityForResult(ActivityTwo, ActivityTwoRequestCode);
Aktivität 2 wird gestartet und Sie können den Vorgang ausführen, um die Aktivität zu schließen.
Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();
Aktivität 1 - Wenn Sie von der vorherigen Aktivität zurückkehren, wird onActivityResult aufgerufen:
@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: Antwort auf Seenu69s Kommentar: In Aktivität zwei,
int result = Integer.parse(EditText1.getText().toString())
+ Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);
Dann in Tätigkeit eins,
int result = data.getExtra(KEY_RESULT);
Es hilft mir, die Dinge im Zusammenhang zu sehen. Hier ist ein komplettes einfaches Projekt zum Zurücksenden von Daten. Anstatt die XML-Layoutdateien bereitzustellen, gibt es hier ein Bild.
startActivityForResult
und geben Sie einen beliebigen Ergebniscode an.onActivityResult
. Dies wird aufgerufen, wenn die zweite Aktivität abgeschlossen ist. Sie können sicherstellen, dass es sich tatsächlich um die zweite Aktivität handelt, indem Sie den Anforderungscode überprüfen. (Dies ist nützlich, wenn Sie mehrere verschiedene Aktivitäten aus derselben Hauptaktivität starten.)Intent
erhalten haben. Die Daten werden mit einem Schlüssel-Wert-Paar extrahiert.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
ein. Die Daten werden in der Variablen Intent
mit einem Schlüssel-Wert-Paar gespeichert.RESULT_OK
und fügen Sie die Absicht hinzu, die Ihre Daten enthält.finish()
auf, um die zweite Aktivität zu schließen.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
nicht bekannt. Verwenden Sie einfach den vollständigen Namen: Activity.RESULT_OK
.FirstActivity verwendet 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");
}
}
Bei SecondActivity-Aufruf setResult () onClick-Ereignisse oder onBackPressed ()
Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(2,intent);
Rufen Sie die untergeordnete Aktivität Intent mit dem Methodenaufruf startActivityForResult () auf
Hier ein Beispiel: http://developer.Android.com/training/notepad/notepad-ex2.html
und im "Ergebnis von einem Bildschirm zurückgeben": http://developer.Android.com/guide/faq/commontasks.html#opennewscreen
Ich habe eine einfache Demo-Klasse für Ihre bessere Referenz erstellt.
ErsteAktivität.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);
}
}
}
}
Und hier ist 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();
}
});
}
}
In der ersten Aktivität können Sie eine Absicht mit startActivityForResult()
senden und dann das Ergebnis der zweiten Aktivität abrufen, nachdem sie mit setResult
fertig ist.
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();
}
}
Es gibt einige Möglichkeiten, dies zu tun .. 1. durch die Verwendung von startActivityForResult (), das in den obigen Antworten sehr gut erklärt wird.
indem Sie die statischen Variablen in Ihrer "Utils" -Klasse oder in einer anderen eigenen Klasse erstellen. Zum Beispiel möchte ich studentId von ActivityB an ActivityA übergeben. Zuerst ruft meine ActivityA die ActivityB auf. Dann setzen Sie in ActivityB die studentId (die ein statisches Feld in Utils.class ist). Verwenden Sie anschließend die studentId, die in Utils.STUDENT_ID gespeichert ist.
erstellen Sie eine Getter- und Setter-Methode in Ihrer Anwendungsklasse.
so was:
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;
}
}
also bist du fertig Setzen Sie einfach die Daten in, wenn Sie sich in ActivityB befinden und nachdem Sie zu ActivityA zurückgekehrt sind, holen Sie die Daten ab.
Verwenden Sie sharedPreferences , speichern Sie Ihre Daten und greifen Sie von überall in der Anwendung darauf zu
datum so speichern
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
Und Daten wie diese erhalten
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String savedPref = sharedPreferences.getString(key, "");
mOutputView.setText(savedPref);
Alle diese Antworten erklären, dass das Szenario Ihrer zweiten Aktivität nach dem Senden der Daten abgeschlossen sein muss.
Falls Sie die zweite Aktivität jedoch nicht beenden möchten und die Daten zuerst an diese zurücksenden möchten, können Sie BroadCastReceiver verwenden.
In der zweiten Aktivität -
Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
In der ersten Aktivität
private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// do some action
}
};
Registrieren Sie den Empfänger in onCreate () -
LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));
Registrierung in onDestroy () aufheben