[OFFEN] Fragment State nach Rotation merken

deka

deka

Dauergast
351
Hallo zusammen, es geht um folgendes Problem.
In meiner App habe ich einen DialogFragment, welches einen ResultManager verwendet und die ermittelten Ergebnisse in der onUpdateReceived dem ResultRecyclerView hinzufügt. Das klappt auch alles wunderbar, sobald ich jedoch das Gerät in den Landscape-Modus drehe, verschwinden die bereits ermittelten Ergebnisse und der Nutzer sieht nur noch ein leeres Fragment. Das heißt ich muss den aktuellen State meines Fragments mir irgendwie merken.

Ich habe es mit dem setRetainInstance(true) in der onCreateView() versucht aber das hat nicht funktioniert. Muss ich meine ganzen Daten in der onSaveInstanceState speichern und in der onActivityCreated() wieder auslesen?

Es geht mir wie beschrieben nur darum, dass beim Rotieren die Daten erhalten bleiben.

Was ist der richtige Weg hier?
 
Hallo Deka,

ich arbeite leiden nicht den Weg , den du verwendest, deshalb kann ich Dir an dieser Stelle leider keine Tips geben.
Ich verwende in der Hauptsache Singeltons um bei OrientationChanges / Resumes etc wieder den Zustand zu bekommen
 
Zuletzt bearbeitet:
Rotation ist doch ein einfacher ConfigChange. Du kannst per AndroidManifest sagen dass du dich darum im Code kümmerst und die Activity nicht zerstört werden soll, wie hier beschrieben : Handling Configuration Changes | Android Developers

Hoffe das hilft dir weiter!

Nicht vergessen dass alle nötigen Anpassungen in Bezug auf das Layout von dir per Hand angepasst werden müssen.

Ansosnten kannst du die Daten als Klassenvariablen deklarieren
 
Zuletzt bearbeitet:
Danke für eure Vorschläge. Ich mache es jetzt doch über den Weg mit SaveInstance.

Code:
@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        resultState = resultRecycler.getLayoutManager().onSaveInstanceState();
        outState.putParcelable("resultState", resultState);
    }

resultState ist in dem Fall mein Parcelable.
In der onCreate meines Fragments lese ich es wieder aus.

Code:
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            resultState = savedInstanceState.getParcelable("resultState");
        }

    }

EDIT:

In meiner Setup-Methode setze ich dann den gemerkten LayoutManager:

Code:
if (resultState != null) {
            resultRecycler.getLayoutManager().onRestoreInstanceState(listState);
        } else {
            resultRecycler.initEmptyAdapter();
        }

Leider funktioniert das nicht. Er macht zwar das restore im Setup (nach dem Rotieren), aber das Fragment ist trotzdem leer.

Speichere ich die falschen Daten hier ab?
 
Zuletzt bearbeitet:
Was ist denn bitte ein ResultManager und ein ResultRecyclerView?
Bitte: Ignoriere die zuvor gegeben antworten. All das sind nur workarounds und haben in der professionellen Android Entwicklung nichts zu suchen.
Singleton und und Orientation Change verhindern

Ok - was auch immer.
Ich verstehe dein genaues Problem noch nicht.
Vielleicht solltest du im generellen erstmal den Lifecircle eines Fragments anschauen. Was passiert überhaupt beim orientation change? Was wird automatisch restored und um was musst du dich selber kümmern?
Der einfachste weg den orientation change zu behalten, ohne das du was verlierst, ist alles im `onCreateView` zu erledigen.
Also nochmal den Adapter erstellen, die Items neu setzen und und und...
Das ist nicht die schönste variante, aber sie hilft.
Wenn es um eine art "auswahl" geht, dann musst du dir natürlich die auswahl position merken und später wieder setzen.
 
  • Danke
Reaktionen: markus.tullius und swa00
Frage, welche Methode ist schöner?

(Bin länger nicht hier gewesen, des wegen die späte Nachfrage.)
 
Die "schönste" Variante ist die, die die professionellste und richtigste ist. Demnach das Speichern im instanceState, so wie er es schon macht.

Das es bei ihm nicht angezeigt wird liegt daran, dass er nur den state des LayoutManagers speichert und wieder setzt. Der LayoutManager weiß aber nichts über die items und speichert demnach nicht den Inhalt.
Um den Inhalt der Liste zu speichern, muss er noch die items im instanceState speichern und wieder dem Adapter geben...
 
Danke, für die Erklärung. War nur neugierig, wie ihr es hält. :) .
 

Ähnliche Themen

5
Antworten
22
Aufrufe
1.423
590239
5
M
Antworten
2
Aufrufe
865
jogimuc
J
Tiefkuehlpizza
Antworten
2
Aufrufe
956
Tiefkuehlpizza
Tiefkuehlpizza
Zurück
Oben Unten