FragmentStatus speichern

  • Antworten:6
Col.Biernot
  • Forum-Beiträge: 30

14.12.2015, 14:17:36 via Website

Hallo,

Kann mir jemand erklären (oder kennt jemand ein gutes Tutorial) wie Ich den Fragmentstatus u.a beim wechsel der Displayorientierung speichere und wieder herstelle.

Viel wichtiger als das ist mir aber die Möglichkeit die, schon befüllten EditTexts in meinem Fragment zu speichern wenn Ich mit Hilfe eines Intents zxing starte und ein edittext mit dem inhalt eines gefüllten barcodes versehe...

Mfg
Rastaman

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

14.12.2015, 17:34:54 via Website

Ich habe davon leider keine ahnung.
Würde ich auch ggern mal wissen.

Bisher unterdrücke ich in der Manifest das neuzeichnen und neuladen der Activity bei änderung der Orientation. Klappt zwar, ist aber nicht das Gelbe vom EI...

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

15.12.2015, 08:06:43 via Website

1) Die "richtige" Lösung

onSaveInstanceState(Bundle) implementieren und alle Werte, die du erhalten willst in das Bundle schreiben.

onCreate(Bundle)
bzw.
onCreateView(... , Bundle)

Implementieren und die Werte aus dem Bundle wieder in die Views schreiben (Vorher bundle != null prüfen).

2) Die schnelle Lösung (ähnlich dem Unterdrücken des Neuladens im Manifest)

In onCreate des Fragments setRetainInstance(true) setzen.
Dann werden die Instanzen eines Fragments wiederverwendet (und damit bleiben automatisch auch die Werte in der UI erhalten)

— geändert am 15.12.2015, 08:07:45

Pascal P.Col.Biernot

Antworten
Col.Biernot
  • Forum-Beiträge: 30

15.12.2015, 10:18:18 via Website

    @Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("label", inputLabel.getText().toString());
    outState.putString("serial", inputSerial.getText().toString());
    outState.putString("mac", inputMac.getText().toString());
    outState.putString("daaid", inputDaaId.getText().toString());
    outState.putString("bill", inputBill.getText().toString());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_add_data, container, false);

    if (savedInstanceState != null){
        inputLabel.setText(savedInstanceState.getString("label"));
    }

Ich versuche es gerade aber stellt nix wieder her.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

15.12.2015, 11:02:42 via Website

[[cite Col.Biernot]]
View view = inflater.inflate(R.layout.fragment_add_data, container, false);

    if (savedInstanceState != null){
        inputLabel.setText(savedInstanceState.getString("label"));
    }

Da fehlt doch ein inputLabel = view.findViewById(...)

Außerdem solltest Du mal mit dem Debugger prüfen, ob er in die Methode überhaupt reinkommt.
Es gibt gewisse Bedingungen wann das Bundle != null ist.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.12.2015, 18:06:25 via Website

Schön und gut so kann man es machen, jetzt müsste ich aber in all meine Objekte die ich behalten will Serzializable oder Parcable ( weiss gerade nicht welches von beiden.. )
Implementieren. Kann man machen, wenn man es will. Were es aber erstmal über die schnelle Lösung machen.
Danke dafür!:)

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

15.12.2015, 19:54:48 via Website

Ich nutze auch meist setRetainInstance.
Man muss halt nur im Hinterkopf behalten, was das für Konsequenzen hat.
z.B. hebelt das unterschiedliche Layouts für Hoch/Querformat aus, weil die Views nicht neu inflated werden beim Drehen.
Auch suggeriert es auf den ersten Blick eine korrekte Erhaltung der Daten über den Lifecycle der Fragmente hinweg,
jedoch gibt es SEHR unvorhersehbare Situationen wo die Instanz dennoch gekillt und neu erstellt wird (Speicher Mangel, langer Stand-By, Taskkiller, ...) und dann sind die Daten in der UI auch weg. Solche Fehler sind dann recht schwer zu debuggen.

Darum setze ich auf eine Kombination aus retainInstance (auch zwecks Performance) und dem Speichern der erhaltenswürdigen Daten im Bundle.
So wird in nahezu allen Fällen nur die Activity neu erstellt und das Fragment zeitsparend wiederverwendet.
Auch in den darüber hinausgehenden Fällen funktioniert es aber korrekt.

Ludy

Antworten