2013-03-25 17 views
21

Ich habe Fragmente, die ich im Backstack von FragmentManager aufbewahre. Jedes Fragment Zustand ist für die Orientierung ändert sich mit Membervariablen gespeichert, wie dies zum Beispiel:Verwenden von OnSaveInstanceState mit Fragmenten im Backstack?

@Override 
public void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putLong("userId", mUserId); 
    outState.putString("username", mUsername); 
} 

Mein Problem ist, dass, wenn es eine Orientierungsänderung ist, da jedes Fragment im Backstack über onSaveInstanceState aufgerufen wird, ich null erhalten Zeigerausnahme, weil die Mitgliedsvariablen nicht mehr existieren.

Irgendwelche Ideen, wie man das löst?

+0

können Sie Ihre Logcat-Fehlermeldung angeben? –

+0

onSaveInstanceState wird aufgerufen, bevor die tatsächliche Änderung angewendet wird. Daher sollten Ihre Variablen beim Aufruf vorhanden sein, es sei denn, sie sind aufgrund anderer Fehler in Ihrem Code ungültig. Post mehr Code zusammen mit der Fehlerausgabe Formular Logcat. – Shade

+0

Ich kann Ihnen versichern, dass meine Variablen in Ordnung sind. Ich denke, das Problem ist, dass meine Fragmente im Backstack nicht onSaveInstanceState aufgerufen werden, wenn sie abgerissen werden; onSaveInstanceState wird nur aufgerufen, wenn die Aktivität zerstört wird, aber meine Variablen nicht mehr existieren. Meine aktuelle Lösung ist also: "if (mUserId! = Null && mUsername! = Null) ...". Es ist nicht schön, aber es löst das Problem. Ich finde es seltsam, eine onSaveInstanceState-Methode für Fragmente zu haben, wenn sie nicht aufgerufen wird, wenn das Fragment abgebrochen wird. –

Antwort

34

Es ist möglich, dass Ihre Mitgliedsvariablen nicht mehr existieren, weil die FragmentManager in Ihrer Activity mit all Ihren Fragmenten stirbt.

Sie müssen auch die Methode onSaveInstanceState Ihre Activity Klasse außer Kraft zu setzen, weil Sie den Activity Zustand speichern müssen, bevor Sie den Fragments Zustand speichern.

Als documentation sagt:

Es gibt viele Situationen, in denen ein Fragment kann meist abgerissen werden (wie zum Beispiel, wenn ohne UI zeigt auf der Rückseite Stapel gelegt), aber sein Zustand wird erst gespeichert werden seine besitzende Tätigkeit muss tatsächlich seinen Staat retten.

UPDATE

In Ihrem ActivityonSaveInstanceState und onRestoreInstanceState, versuchen Sie Fragment Referenzen speichern und sie dann so etwas wieder her:

public void onSaveInstanceState(Bundle outState){ 
    getFragmentManager().putFragment(outState,"myfragment",myfragment); 
} 
public void onRestoreInstanceState(Bundle inState){ 
    myFragment = getFragmentManager().getFragment(inState,"myfragment"); 
} 

Sagen Sie mir dann, wenn Sie Glück gehabt! :-)

+0

Was soll ich dann tun? Soll ich den onSaveInstanceState des Fragments vom onSaveInstanceState der Aktivität aufrufen? –

+0

Ein UPDATE für Sie in der Antwort. –

+0

ok ... so onSaveInstanceState für Fragmente ist so ziemlich wertlos. Zumindest für Fragmente (Fragmenttransaktionen), die sich im Backstack befinden. –

0

Setzt die setRetainInstance auf die Fragmenthilfe. ausprobieren

+0

Wenn Fragment für UI-Zwecke verwendet wird, dann setze 'setRetainInstance' niemals auf' true'! – matusalem

5

Aufbauend auf Jorge Gil - ‚xɔɾ.xɛ xil Antwort Beachten Sie Folgendes:

  • Vergessen Sie nicht die Super-Implementierungen von onSaveInstanceState() aufrufen und onRestoreInstanceState().
  • Wenn Sie das Support Package verwenden: Verwenden Sie getSupportFragmentManager() anstelle von getFragmentManager().
  • Wenn Sie Ihr Originalfragment abrufen, müssen Sie es umwandeln.

Entschuldigung, dass Sie Captain offensichtlich sind!

0

Ich denke, die richtige Lösung ist, diese Mitglied Variablen aus savedInstanceState in onCreate zu lesen, die immer vor onSaveInstanceState aufgerufen werden soll. Wenn Sie die Felder in onViewCreated verarbeiten, haben sie nicht die Möglichkeit, vor dem nächsten onSaveInstanceState initialisiert zu werden (in diesem speziellen Fall, wenn Fragment im Backstack ist).

Verwandte Themen