web-dev-qa-db-de.com

savedInstanceState beim Wiederherstellen eines Fragments vom Backstack

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 Backstack wiederherstelle, ist savedInstanceState-Bundle immer null.

Im Moment ist der Anwendungsfluss: Fragment erstellt -> Fragment entfernt (zum Backstack hinzugefügt) -> Fragment vom Backstack wiederhergestellt (SavedInstanceState-Bundle ist null).

Hier ist der relevante 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 es entfernt und zum Backstack hinzugefügt wird. Wenn ich onsavedInstanceState () nicht verwenden kann, gibt es eine andere Möglichkeit, dies zu beheben?

36
heero

onSaveInstanceState wird bei der normalen Neuerstellung eines Fragments im Backstack (leider) nicht aufgerufen. Check out http://developer.Android.com/guide/components/fragments.html#Creating und die Antwort on Wie kann ich den Fragmentstatus beibehalten, wenn ich ihn dem Backstack hinzufüge?

6
Eric

Ich möchte die Ansicht, die ich in onCreateView zurückgebe, als globale Variable speichern. Wenn ich zurückgebe, überprüfe ich einfach Folgendes:

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

Das Problem ist, dass dem Fragment ein Id oder Tag zugeordnet sein muss, damit das FragmentManager den Überblick behält.

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

  1. Deklarieren Sie im XML-Layout ein Id für Ihr Fragment:

    Android:[email protected]+id/<Id>
    
  2. Wenn Ihr Fragmentcontainer View ein Id hat, verwenden Sie FragmentTransaction :

    FragmentTransaction  add (int containerViewId, Fragment fragment)
    
  3. Wenn Ihr Fragment keinem View zugeordnet ist (z. B. kopfloses Fragment), geben Sie ihm ein Tag:

    FragmentTransaction  add (Fragment fragment, String tag)
    

Siehe auch diese SO Antwort.

3
bcorso

FWIW, ich habe dies auch getroffen, aber in meinem Fall wurde onSaveInstanceState ordnungsgemäß aufgerufen und ich habe meine Statusdaten eingegeben, als ein neues Aktivitätsfragment auf dem Smartphone aufgerufen wurde. Wie Sie wurde auch onActivityCreated mit dem Status savedInstanceState immer als null bezeichnet. IMHO, ich denke es ist ein Bug.

Ich habe es umgangen, indem ich einen statischen MyApplication-Status erstellt und die Daten dort für das Äquivalent von "globalen Variablen" abgelegt habe ...

0
kenyee