Möchte man Daten zwischen 2 Activitys austauschen so kann man diese Daten in einer Intent speichern und später wieder aus dieser laden.
Wie dieses genau geschieht, möchte ich in diesem Tutorial beschreiben.
Ziel
Ziel soll es sein, dass Daten zwischen 2 Activitys ausgetauscht werden können. Diese Daten sind zuerst einfache java.lang.String Daten.
Aufbau des Projektes
Als IDE verwende ich Android Studio und ein kleines Projekt welches nur 2 Activitys besitzt.
Die “MainActivity” wird angezeigt, wenn die App gestartet wird (dieses wird in der AndroidManifest.xml gesteuert) und soll im späteren Verlauf die Daten aus der InputActivity anzeigen.
Der Quellcode
MainActivity
Die MainActivity enthält die TextView Komponenten für
- Vorname, und
- Name
Des Weiteren den Button “Eingeben”.
Der Aufruf der InputActivity wird im OnClick Event der Schaltfläche “Eingeben” realisiert.
Button inputBtn = (Button) findViewById(R.id.inputBtn); inputBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplicationContext(), InputActivity.class); startActivityForResult(intent, INPUT_ACTIVITY_RESULT); } });
Die Konstante INPUT_ACTIVITY_RESULT ist ein beliebiger, primitiver, Integer Wert.
InputActivity
Die InputActivity enthält die Komponenten um den Vornamen und Namen einzugeben (EditText) und den Button “Absenden” um diese Daten an die Main Activity zu senden.
Button sendBtn = (Button) findViewById(R.id.sendBtn); sendBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } });
Die Methode “onClick”, ruf nur die Methode, “finish” der InputActivity auf, diese Methode muss nun wie folgt überschrieben werden:
@Override public void finish() { EditText vornameEditText = (EditText) findViewById(R.id.vornameEditText); EditText nameEditText = (EditText) findViewById(R.id.nameEditText); Intent data = new Intent(); data.putExtra("vorname", vornameEditText.getText().toString()); data.putExtra("name", nameEditText.getText().toString()); setResult(RESULT_OK, data); super.finish(); }
Wichtig ist hier das “RESULT_OK” als Result gesetzt wird, denn sonst wird immer ein RESULT_CANCELD gesendet.
Die Daten für die MainActivity werden in die Intent mit der Methode “putExtra” gepackt. Die Methode “putExtra” kann diverse Datentypen annehmen.
Für dieses Beispiel reicht es aus das die Daten im java.lang.String übergeben werden.
Nachdem die Daten in der Intent abgelegt wurden kann zur MainActivity zurückgekehrt werden. Dieses geschieht indem man mit “super.finish();”.
Verarbeiten der Daten in der MainActivity
Nachdem in der InputActivity die Daten eingegeben und an die MainActivity gesendet wurden, können diese nun verarbeitet werden. Dazu überschreiben wir die Methode “onActivityResult” wie folgt:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == INPUT_ACTIVITY_RESULT) { if (resultCode == RESULT_OK) { String vorname = data.getStringExtra("vorname"); String name = data.getStringExtra("name"); TextView vornameTextView = (TextView) findViewById(R.id.vornameTextView); vornameTextView.setText(vorname); TextView nameTextView = (TextView) findViewById(R.id.nameTextView); nameTextView.setText(name); } } }
Es wird zuerst geprüft ob der RequestCode von der zuvor gestarteten InputActivity stammt, dieses könnte in diesem Beispiel entfallen da hier nur eine Activity gestartet wird.
Als Nächstes wird der ResultCode geprüft, sollte der Benutzer die InputActivitiy über den ZurückButton des Android Gerätes verlassen haben, so wird ein RESULT_CANCELD gesendet, d.h. nur bei RESULT_OK empfangen und verarbeiten wir die Daten.
Die Daten bekommt man wiederum aus der Intent mit der Methode “data.getStringExtra” da wir diese als String abgelegt haben.
Senden und Empfangen von Objekten
Es wurde bisher “nur” einfache Datentypen verwendet, möchte man jedoch komplexe Objekte zwischen zwei Activitys austauschen, so kann man sich mit dem JSON Format und der Google Bibliothek GSON behelfen. Diese Bibliothek macht es einfach Objekte von und nach JSON zu konvertieren. Schreiben wir also das Projekt etwas um.
Einbinden der Bibliothek
Die Bibliothek wird im Android Studioprojekt in der Datei “build.gradle (Module:app)” eingebunden. Dazu wird folgender Import hinzugefügt:
compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
Es muss nun noch synchronisiert werden und dann kann diese Bibliothek schon verwendet werden.
Person Objekt
Für dieses Beispiel verwende ich ein einfaches Person-Objekt welches folgende Attribute besitzt:
- Vorname
- Name
Die Klasse dazu sieht folgendermaßen aus:
public class Person { private String vorname; private String name; public String getVorname() { return vorname; } public void setVorname(String vorname) { this.vorname = vorname; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Sicherlich würde man hier noch die Methoden toString, equals und hashCode überschreiben aber dieses erspare ich in diesem Beispiel.
Methode Finish in InputActivity
Die Methode Finish wird wie folgt angepasst
Intent data = new Intent(); Person person = new Person(); person.setName(nameEditText.getText().toString()); person.setVorname(vornameEditText.getText().toString()); data.putExtra("person", new Gson().toJson(person));
Es wird zuerst ein neues Person-Objekt erstellt und danach die Werte aus den Eingabefeldern zugewiesen. Dieses befüllte Person Objekt wird dann mit Gson nach JSON konvertiert.
{"name":"Draeger","vorname":"Stefan"}
Da das JSON Format ein Stringformat ist kann dieses nun einfach als String dem Intent wie zuvor mit der Methode putExtra hinzugefügt worden. Als KEY verwende ich hier jedoch “person”.
Methode onActivityResult in MainActivity
Nachdem nun ein JSON versendet wird muss dieses in der MainActivity wieder in das Person-Objekt zurückkonvertiert werden. Auch dazu verwendet man dieselbe Bibliothek.
Person person = new Gson().fromJson(data.getStringExtra("person"), Person.class);
Hierzu wird der JSON String aus der Intent mit der Methode getStringExtra geladen (und dem passenden KEY) zusätzlich wird die Klasse genannt in welche dieser String konvertiert werden soll.
Als Ergebnis bekommt man wieder das Person-Objekt, die Werte bekommt man wie gewohnt über die zuvor veröffentlichten Getter Methoden.
Download
Hier nun der Download des Android Studio Projektes: