2012-06-20 14 views
34

È possibile utilizzare lo standard savedInstanceState() per salvare lo stato quando si rimuove un frammento, quindi ripristinare lo stato quando si espelle il frammento dallo stack posteriore? Quando ripristino il frammento dallo stack posteriore, il pacchetto savedInstanceState è sempre nullo.savedInstanceState durante il ripristino del frammento dallo stack posteriore

Al momento, il flusso dell'app è: frammento creato -> frammento rimosso (aggiunto allo stack posteriore) -> frammento ripristinato dallo stack posteriore (il pacchetto salvatoInstanceState è null).

Ecco il codice rilevante:

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); 
    } 

Credo che il problema è che non è mai onSavedInstanceState() chiamato quando viene rimosso e di essere aggiunto alla parte posteriore dello stack. Se non posso usare onsavedInstanceState(), c'è un altro modo per risolvere questo problema?

risposta

0

FWIW, mi ha colpito questo pure, ma nel mio caso onSaveInstanceState stato chiamato correttamente e ho spinto nei miei dati dello stato in caso di nuove attività frammento è stato portato sullo smartphone. Come te, l'onActivityCreated è stato chiamato w/savedInstanceState sempre nullo. IMHO, penso che sia un bug.

ho lavorato intorno ad esso con la creazione di uno stato MyApplication statica e mettendo i dati lì per l'equivalente di "variabili globali" ...

5

mi piace per memorizzare la vista torno in onCreateView come una variabile globale e quindi quando torno semplicemente controllare questo:

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

Molte grazie :) Il suo risolto il problema –

+6

non sono sicuro che sia una buona idea. Questo vanifica lo scopo di distruggere la vista per liberare memoria se si salva un riferimento ad esso? – craigrs84

+0

In realtà non sono sicuro, perché non ho eseguito test diretti. Tuttavia, il mio pensiero va così.Quando si inizializzano tutti gli elementi nel proprio layout, è normale impostare la maggior parte di questi elementi come variabili globali, quindi se nell'esempio precedente non potrei riciclare la Vista di base a causa del riferimento, Android non sarebbe in grado di riciclare una qualsiasi di queste viste, portando così allo stesso problema con la memoria. – AllDayAmazing

4

il problema è che il frammento deve avere una Id o Tag associato con esso in modo che il FragmentManager per tenere traccia di esso.

Ci sono almeno 3 modi per farlo:

  1. Nel file XML di layout dichiarare un Id per il frammento:

    android:[email protected]+id/<Id> 
    
  2. Se il vostro frammenti contenitore View ha un Id, utilizzare FragmentTransaction :

    FragmentTransaction add (int containerViewId, Fragment fragment) 
    
  3. Se il frammento non è associato a qualsiasi View (ad es. senza testa frammento), dare un Tag:

    FragmentTransaction add (Fragment fragment, String tag) 
    

Also, see this SO answer.

Problemi correlati