2012-06-20 9 views
34

Kann ich savedInstanceState() verwenden, um den Status beim Entfernen eines Fragments zu speichern, und dann den Status wiederherstellen, wenn ich das Fragment vom Backstack lösche? Wenn ich das Fragment vom Backstapel wiederherstelle, ist das sainedInstanceState-Bundle immer null.savedInstanceState beim Wiederherstellen eines Fragments aus dem Backstack

Derzeit ist der App-Ablauf: Fragment erstellt -> Fragment entfernt (zum Backstack hinzugefügt) -> Fragment aus Backstack wiederhergestellt (SavedInstanceState-Bundle ist null). Hier

ist der entsprechende Code:

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle bundle = getArguments(); 
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID); 
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID); 

    if (savedInstanceState == null) { 
     selectedVideoNumber = playlistItemId; 
    } else { 
     selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO"); 
    } 
} 

public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber); 
    } 

Ich denke, das Problem ist, dass onSavedInstanceState() nie aufgerufen wird, wenn sie entfernt werden und hinzugefügt Stapel zurück. Wenn ich onsavedInstanceState() nicht verwenden kann, gibt es eine andere Möglichkeit, das zu beheben?

Antwort

0

FWIW, schlug ich das so gut, aber in meinem Fall onSaveInstanceState wurde richtig genannt und ich schob in meinem Zustand Daten, wenn ein Fragment neue Aktivität wurde auf dem Smartphone gebracht. Genau wie du, wurde onActivityCreated mit savedInstanceState immer null aufgerufen. IMHO, ich denke, es ist ein Fehler.

ich um es funktionierte durch einen statischen MyApplication Staat zu schaffen und die Daten dort für das Äquivalent von „globalen Variablen“ setzen ...

5

Ich mag die Ansicht I als globale Variable in onCreateView zurückkehren speichern und dann wenn ich kehre ich dies einfach überprüfen:

if(mBaseView != null) { 
     // Remove the view from the parent 
     ((ViewGroup)mBaseView.getParent()).removeView(mBaseView); 
     // Return it 
     return mBaseView; 
    } 
+0

Vielen Dank :) Das löste mein Problem –

+6

nicht sicher, dies ist eine gute Idee. Beendet dies den Zweck, die Ansicht zu zerstören, um Speicher freizugeben, wenn Sie einen Verweis darauf speichern? – craigrs84

+0

Ich bin mir eigentlich nicht sicher, da ich keine direkten Tests durchgeführt habe. Mein Denken geht jedoch so.Wenn Sie alle Elemente in Ihrem Layout initialisieren, ist es Standard, die meisten dieser Elemente als globale Variablen festzulegen. Wenn also im obigen Beispiel die Basisansicht aufgrund der Referenz nicht wiederverwendet werden kann, ist Android nicht in der Lage, das Element zu recyceln Jede dieser Ansichten führt zu demselben Problem mit dem Speicher. – AllDayAmazing

4

das Problem ist, dass das Fragment für die FragmentManager mit sich um ein Id oder Tag zugeordnet haben muss Überblick zu behalten.

Es gibt mindestens drei Möglichkeiten, dies zu tun:

  1. im XML-Layout ein Id für Ihr Fragment erklären:

    android:[email protected]+id/<Id> 
    
  2. Wenn Ihr Behälter Fragment View ein Id hat, verwenden FragmentTransaction :

    FragmentTransaction add (int containerViewId, Fragment fragment) 
    
  3. Wenn Ihr Fragment keinem View zugeordnet ist (z. Headless-Fragment), gibt ihm ein Tag:

    FragmentTransaction add (Fragment fragment, String tag) 
    

Also, see this SO answer.