onSaveInstance Verständnis

  • Antworten:6
ECR
  • Forum-Beiträge: 72

29.09.2012, 14:58:29 via Website

Ok ich habe sehr viel gegoogelt zu diesem Thema, irgendwie bekomm ich es trotzdem nicht hin..

Ich habe eine TabActivity mit 3 Fragmenten. Sobald ich den Bildschirm drehe oder den Home Button drücke und zurück zur Activity komme sieht es so aus das einfach alle Fragments ineiander geschrieben werden.

Ich dachte man kann einfach das gesamte Activity Bundle speichern und danach wieder aufrufen.

Doch ich versteh nicht was in
1if( savedInstanceState != null ) {
schreiben muss? Kann ich nicht einfach sagen lade die bereits bestehende Activity? DIese putString sachen sind doch nur dazu da um die Werte in den Textfelder zu speichern`?
1@Override
2public void onSaveInstanceState(Bundle outState) {
3 super.onSaveInstanceState(outState);
4 outState.putString("message", "This is my message to be reloaded");
5}
6
7@Override
8public void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10 if( savedInstanceState != null ) {
11 Toast.makeText(this, savedInstanceState .getString("message"), Toast.LENGTH_LONG).show();
12 }
13}

Antworten
Gelöschter Account
  • Forum-Beiträge: 82

30.09.2012, 19:13:56 via Website

outState.putString() speichert die Daten im Bundle.

Bei if( savedInstanceState != null ) musst du dann savedInstanceState.getString() abfragen, um den String wieder zu bekommen.

Antworten
ECR
  • Forum-Beiträge: 72

01.10.2012, 18:26:17 via Website

Ok ich habe das nun so gemacht. Leider bleibt das Problem bestehen. Ich kann die Fragmente durchklicken und es stimmt. Sobald ich aber den Bildschrim drehe und dann wieder die Fragmente durchklicke stimmt es nicht mehr, die Fragmente werden ineinander geschrieben. Daher gehe ich davon aus das die Activity neu gestartet wird. Wenn ich nämlich den Trick

1android:configChanges="orientation|screenSize|keyboardHidden"

verwende, arbeitet alles genau so wie es soll? Was mich ich mit dem onSaveInstance falsch?

1@Override
2 protected void onSaveInstanceState(Bundle outState) {
3 // TODO Auto-generated method stub
4 super.onSaveInstanceState(outState);
5 outState.putString("schlüssel", "ein Wert");
6 }
7
8
9 @Override
10 public void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12
13 if( savedInstanceState != null ) {
14 savedInstanceState.getString("schlüssel");
15 }

Antworten
Gelöschter Account
  • Forum-Beiträge: 82

01.10.2012, 18:38:35 via Website

Fragst du das savedInstanceState.getString("schlüssel"); schon ab?

Du musst es etwa so schreiben (ungetestet)

1String s = savedInstanceState.getString("schlüssel");
2tv.setText(s);

Antworten
ECR
  • Forum-Beiträge: 72

01.10.2012, 23:11:36 via Website

Ich bin im moment nicht in der nähe des PC. Aber auf was refernzierts du mit tv? Auf eine Textview? Ich habe ja ein ganzes Fragmente mit vielen Einträge, und nicht bloss einer Textview? Oder muss ich mit tv irgendwie auf das Layout referenzieren?

Antworten
Gelöschter Account
  • Forum-Beiträge: 82

02.10.2012, 15:48:31 via Website

Du kannst bei onSaveInstance nur einzelne Daten speichern.
Beim Restore musst du die Daten wieder da hin schreiben, wo sie her kamen.

Also z.B. in eine TextView, ImageView, ListView,...

Antworten
ECR
  • Forum-Beiträge: 72

02.10.2012, 18:51:57 via Website

Mhm dann habe ich das aber schon richtig Verstanden....

Aber das ist ja irgendwie ziemlich umständlich?! Ich dachte es wäre möglich die ganze Activtiy irgendwie zu speichern. Und nicht die einzelne Textfelder auslesen zu müssen?? Naja dann bleib ich wahrscheinlich bei der AndroidManifest Variante...

Danke für die Hilfe, wenigsten weiss ich es nun wie es funktionieren würde

— geändert am 02.10.2012, 18:53:12

Antworten