Ho un'attività, che contiene 'lista' di frammenti, che dopo aver fatto clic su uno dei suoi elementi si sostituirà a un frammento di 'contenuto'. Quando l'utente usa il pulsante Indietro, viene nuovamente inserito nel frammento "elenco".
Il problema è che il frammento è nel suo stato predefinito, non importa cosa cerco di mantenere i dati.Come mantenere i dati dei frammenti dopo le transazioni backstack?
fatti:
- entrambi i frammenti vengono creati attraverso
public static TheFragment newInstance(Bundle args)
,setArguments(args)
eBundle args = getArguments()
- entrambi i frammenti sono sullo stesso livello, che è direttamente all'interno di un
FrameLayout
dall'attività principale (cioè, non frammenti annidati - Non voglio chiamare
setRetainInstance
, perché la mia attività è un flusso principale/dettaglio, che ha un layout a 2 riquadri su schermi più grandi. Le tavolette da 7 "hanno 1 riquadro in verticale e 2 riquadri in orizzontale Se conservo l'istanza del frammento 'elenco', sarà (penso) scopare con rotazioni dello schermo - quando gli utenti fanno clic su un elemento nella 'lista' frammento, il frammento di 'contenuto' è visualizzato attraverso
FragmentTransaction#replace(int, Fragment, String)
, con lo stesso ID, ma un tag diverso - ho fatto l'override
onSaveInstanceState(Bundle)
, ma questo non è sempre chiamato dal framework, come per the doc: "ci sono molte situazioni in cui un frammento può essere in gran parte abbattuto (come quando è collocato sullo stack posteriore senza visualizzazione dell'interfaccia utente), ma il suo stato non verrà salvato finché l'attività proprietaria non avrà effettivamente bisogno di salvare il suo stato. " - Sto utilizzando la libreria di supporto
Da sopra il punto 5, immagino che i dispositivi di fascia bassa che hanno bisogno di recuperare la memoria dopo una transazione frammento può chiamare Fragment#onSaveInstanceState(Bundle)
. Tuttavia, sui miei dispositivi di test (Galaxy Nexus e Nexus 7), il framework non chiama questo metodo. Quindi non è un'opzione valida.
Quindi, come posso conservare alcuni dati di frammento? il pacchetto passato a Fragment#onCreate
, Fragment#onActivityCreated
, ecc. è sempre null
.
Quindi, non posso fare la differenza da un lancio del nuovo frammento a un ripristino dello stack posteriore.
Nota: possibile related/duplicate question
Al momento l'unica opzione disponibile è: 'isFromBackStack = getActivity(). GetSupportFragmentManager(). GetBackStackEntryCount()> 0'. Mi piacerebbe avere qualcosa di più pulito, mi sembra un trucco. Inoltre, non ottengo un 'Bundle' dall'istanza del frammento precedente. –