Android Entwicklung: Aufruf Activity für Rückgabewert

Anders als im Artikel Datenübergabe zwischen Klassen / Activities kann es aber auch gewünscht sein nicht nur einen Datenwert in eine andere Activity zu bringen, sondern aus einer Activity kurzzeitig eine andere Aufrufen in der der User etwas auswählt und diese sich dann wieder schließt und dabei einen Wert in die Ursprungsklasse zurückgibt. Denkbar ist dies bei Optionen oder Einstellungen.

Gegeben seien zwei Activities Klasse1 und Klasse2. Klasse1 soll bei Klick auf einen Button Klasse2 aufrufen, der User soll dort über einen EditText oder einen RadioButton etwas auswählen oder eingeben. Bei Klick auf einen Button in Klasse2 (z.B. „Speichern“) soll die Activity sich beenden und der Wert in die Klasse1 zurückgegeben werden.

Zuerst in Klasse1 innerhalb eines onClick für einen Button (z.B. „Einstellungen“):

Intent i = new Intent(Klasse1.this, Klasse2.class);
startActivityForResult(i, 0);

Wir erstellen einen Intent mit Bezug auf die eigene und die Ziel-Activity. Dieser Intent wird dann über startActivityForResult aufgerufen. Normalerweise ruft man einen Intent über startActivity auf – dabei ist es aber nicht möglich auf einen Rückgabewert zu warten.

Wir wechseln nun in Klasse2. Der User muss hier z.B. die Möglichkeit haben einen Text in ein EditText zu schreiben. Den Inhalt dessen lädt man sich in eine String-Variable. Ich nehme hier an, die String-Variable ist nun gefüllt und heißt text.

Intent person = new Intent();
Bundle rucksack = new Bundle();

Wir erstellen (wie schon in der oben verlinkten Anleitung gezeigt) einen Intent – das ist der Aufruf einer anderen Activity. Diesen nenne ich mal person. Zudem erstellen wir einen Bundle – das ist ein Objekt in das man Variablen legen kann, drum nenn ich es mal rucksack.

rucksack.putString("wert1", text);
person.putExtras(rucksack);

In das Bundle rucksack legt man jetzt den String. Dabei muss dem eingepackten Objekt noch ein Name gegeben werden unter dem es „auf der anderen Seite“ angesprochen werden kann -> hier „wert1“. Dieser Name ist natürlich frei wählbar, wir auch die Variablennamen rucksack und person. Nun geben wir dem Intent person noch ein Extra mit, nämlich den gepackten rucksack. Zusätzlich muss bei Activities die über „startActivityForResult“ aufgerufen wurden noch folgender Rückgabewert mitgegeben werden, dass die ursprüngliche Activity weiß, dass die Daten richtig übergeben wurden:

setResult(RESULT_OK, person);

Abschließend lassen wir die Activity noch beenden um in die alte Activity Klasse1 zurückzukommen:

finish();

Nun wechseln wir zurück in Klasse1 um die Daten dort auffangen zu lassen. Hier lassen wir uns die Methode „onActivityResult“ erstellen. Das geht in Eclipse mit einem Rechtsklick in den Quelltext – Source – Override/Implement Methods. Man kann sich aber auch einfach den Text hier reinkopieren.

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
  super.onActivityResult(requestCode, resultCode, data);

}

Nun schreibt man innerhalb der Methode, aber unterhalb vom Konstruktor „super.onActivityResult“ die Abfrage, ob die Daten richtig übergeben wurden. Das geht so:

if(resultCode == RESULT_OK)
{
}

Wenn der resultCode „RESULT_OK“ ist, wie wir in Klasse2 mitgegeben haben, dann kann der Inhalt unseres Rucksacks übernommen werden. Daher schreiben wir in die Abfrage:

Bundle korb = data.getExtras();
String s = korb.getString("wert1");

Man erstellt sich hier auch ein Bundle, das ich mal korb genannt habe und lädt sich aus dem „data“ – was die Standardvariable für das Datenpaket bei „onActivityResult“ ist (hier wird der Intent „person“ übergeben) – die Extras. Wir erinnern uns, in den Extras steckt der rucksack mit seinem String den wir „wert1“ gelabelt haben. Zum Abschluss erstellen wir uns kurz einen String, sollten wir keinen zur Hand haben, und holen uns den übergebenen String aus dem Bundle indem wir ihn mit dem Namen „wert1“ ansprechen den wir ihm in Klasse2 gegeben haben.

Hier nochmals die Methode onActivityResult komplett:

 

protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
  super.onActivityResult(requestCode, resultCode, data);
  if(resultCode == RESULT_OK)
  {
    Bundle korb = data.getExtras();
    String s = korb.getString("wert1");
  }
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
%d Bloggern gefällt das: