In diesem kurzen Tutorial möchte ich gerne erklären wie ich Transferobjekte von einer Intent zur anderen übergebe.
Einbinden der Bibliothek GSON
Bei dieser Übergabe hilft mir die Bibliothek GSON von Google, welche in der Datei „build.gradle (Module : app) folgendermaßen eingebunden wird:
dependencies { ... compile group: 'com.google.code.gson', name: 'gson', version: '2.7' }
Ggf. können in dem Abschnitt „dependencies“ weitere Bibliotheken oder Pfade stehen, welche natürlich nicht überschrieben werden sollten.
Wenn der Pfad zur Bibliothek hinzugefügt und die Datei gespeichert wurde, muss eine Syncronisation durchgeführt werden. Dazu klicken Sie auf den Hyperlink „Sync now“ oben links.
Es wird nun die Bibliothek aus dem Internet geladen und bereitgestellt, dieses dauert je nach Verbindung und Geschwindigkeit des Computers.
Eine JUnit Testklasse für GSON
Um zu Testen das mein Transferobjekt, in diesem Fall die Klasse „RechenknirpsTO“ nach JSON und von JSON wieder korrekt in die Klasse gewandelt wird habe ich folgende JUnit Klasse geschrieben.
public class RechenknirpsTOTest { private RechenknirpsTO originalRechenknirpsTO; @Before public void beforeTest(){ originalRechenknirpsTO = new RechenknirpsTO(); originalRechenknirpsTO.setName("Stefan"); originalRechenknirpsTO.setDiv(false); originalRechenknirpsTO.setMal(false); originalRechenknirpsTO.setMinus(true); originalRechenknirpsTO.setPlus(true); originalRechenknirpsTO.setZahlenraum(100); } @Test public void shouldBeTheSame(){ Gson gson = new Gson(); //erstellen / instanzieren des Objektes Gson String value = gson.toJson(originalRechenknirpsTO); // Umwandeln des Transferobjektes in ein JSON RechenknirpsTO rechenknirpsTO = gson.fromJson(value,RechenknirpsTO.class); // Umwandeln des JSON in das Transferobjekt assertEquals(rechenknirpsTO,originalRechenknirpsTO); // prüfen ob beide Objekte gleich sind } }
Übergabe von Parametern einer Intent
Eine Intent kann über die Methode „getExtras“ verschiedene Parameter bekommen, jedoch ist leider nicht die Übergabe von Objekten vorgesehen (vielleicht kommt das ja in einer späteren Version). Daher müssen wir nun über den Weg des JSON gehen:
Intent intent = new Intent(getApplicationContext(), GameActivity.class); Gson gson = new Gson(); // erstellen / instanzieren des Gson Objektes String value = gson.toJson(rechenknirpsTO); // umwandlung vom Transferobjekt in ein JSON intent.putExtra("rechenknirpsTO",value); // setzen des JSON mit dem Key "rechenknirpsTO" startActivityForResult(intent, 0); //starten der Intent
Auslesen der Parameter
Um nun in der neuen Activity das Transferobjekt zu bekommen, muss man sich in der Activitya die Intent holen und dort das Bundle laden, dieses geschieht mit der Methode „getExtras()“.
Dieses Bundle Objekt enthält nun das Transferobjekt welches mit dem Key „rechenknirpsTO“ abgelegt wurde. Nun kann wiederum mithilfe der Gson Bibliothek das Transferobjekt aus dem JSON generiert werden (siehe JUnit Test).
In meiner Activity sieht das dann folgendermaßen aus:
Intent intent = getIntent(); // holen der Intent in einer Activity Bundle bundle = intent.getExtras(); // das Bundle Objekt holen Object o = bundle.get("rechenknirpsTO"); // aus dem Bundle Objekt der Wert zum Key "rechenknirpsTO" holen Gson gson = new Gson(); // erstellen / instanzieren des Gson Objektes RechenknirpsTO rechenknirpsTO = gson.fromJson(o.toString(),RechenknirpsTO.class); // umwandeln des JSON in das Transferobjekt mit Gson
Damit habe ich nun das Transferobjekt von einer in die andere Activity transferiert ohne das eine statische Klasse oder andere Hilfsmittel verwendet werden musste.