2015-06-05 23 views
5

Ciao Ho un'attività con due frammenti.Ripristino Android istanza dello stato di un frammento che si trova nel backstack

  1. frammento A
  2. frammento B

    • Frammento A ha un'EditText e ListView.
    • Una volta immesso qualcosa nel testo EditText e premuto Immettere, popolare il ListView.
    • Ora il frammento A di ListView è popolato con i dati.
    • Cliccando un qualsiasi elemento del ListView di frammento A invierà all'utente di frammento B
    • A questo punto Sto sostituendo frammento A con frammento B
    • Così, quando l'utente preme il pulsante di nuovo torna a frammentare A

Ora il problema è se l'utente è in frammento B e cambiamenti di configurazione si verificano come la rotazione dello schermo ecc più di una volta poi che il mio mio ListView è vuoto perchè mio arraylist è nullo.

nota che sto utilizzando onSavedInstanceState nel frammento A e B. frammento Se il mio frammento corrente è avvengono frammento A e di configurazione cambia allora non ci sono problemi di ripristino dello stato dal momento che in onCreateView Mi è toccato l'arraylist dal fascio.

Conosco il motivo per cui il mio arraylist è nullo quando ritorno dal frammento B al frammento A che è nel backstack in precedenza. Quando il frammento A è nel backstack, l'unico metodo che viene chiamato è onSaveInstanceState, quindi dopo la prima modifica cambiare il mio campo arraylist è nullo in quanto non potrei assegnare il mio arraylist memorizzato nel pacchetto savedInstateState al campo arraylist.

Non voglio utilizzare Android: attributo configchanges nel mio manifest.

La mia domanda è come posso ripristinare lo stato di un frammento che si trova nel backstack.

+0

Basta memorizzare il tuo arralist nel metodo 'onSavedInstance()'. Quindi controlla il metodo 'onCreateView()' se 'onSavedInstance' non sarà nullo, quindi recuperi il tuo arraylist. – Piyush

+0

Non funziona nel mio caso. Il metodo dichiarato funziona per saveState quando cambia l'orientamento del dispositivo, ma il mio problema sta tornando dal frammento B – krishna

+1

Quando si esegue la prima chiamata 'onStart()', controllare se il proprio arraylist non è nullo, quindi impostare l'adattatore. – Piyush

risposta

0

È possibile utilizzare setRetaininstance(true) in onAttach e questa riga ConfigChanges = "screenSize|keyBoardHidden|orientation" nel file manifest dell'attività.

+0

Vikram Ho menzionato nella domanda che non voglio interrompere l'attività per ricreare se stessa quando cambia la configurazione. Quindi usare ConfigChanges non raggiungerà l'obiettivo – krishna

2

Ho raggiunto l'obiettivo di mantenere lo stato del frammento che si trova nel backstack passando tutti i dettagli di quel frammento all'attività principale prima di essere aggiunto allo stack backstack e di salvare lo stato nello stato salvato dell'elemento principale dell'attività e ogni volta che si modificano i backstack e precedenti frammento è visibile Sto passando lo stato di istanza salvato di quel frammento ad esso dall'attività principale e in questo modo sto mantenendo lo stato. Non sono sicuro se questo sia l'approccio giusto.

2

Ho attraversato il tuo scenario. Fondamentalmente stai facendo il lavoro giusto quando aggiungi un array di arraylist nella condizione salvata nel tuo frammento ma secondo me stai facendo un piccolo errore nella tua attività.

Come quando l'orientamento cambia l'attività di chiamata OnDestroy poi onCreate in questo scenario, se non si sta verificando che sia il vostro frammento è già stato aggiunto o meno allora lo sostituirà con uno nuovo. Qui è il codice che si dovrebbe mettere in onCreate()

FragmentManager fragmentManager = getFragmentManager(); 
    Fragment fragment = fragmentManager.findFragmentByTag("FragmentA"); 
    if(fragment==null){ 
     fragmentManager.beginTransaction().add(R.id.container, new FrgamentA(), "FragmentA").commit(); 
    } 

Un altro punto è quando si desidera che il primo frammento da conservare aggiungere

setRetainInstance(true); 

in onCreate di frammento.

Si prega di trovare questa demo presso GitHub inpulse-fragment

In questa demo in un primo frammento quando si aumenterà il contatore che sarà apparire in modalità testo sopra e se si fa clic su questo punto di vista testo che sarà passare alla Frammento B. Ora puoi provare a ruotare. Fatemi sapere in caso di qualsiasi domanda.

+0

setRetainInstance (true); Non funziona per me poiché voglio che il frammento venga ricreato di nuovo e usando setRetainInstance (true) il frammento non verrà ricreato di nuovo. Inoltre ho un codice simile per aggiungere frammenti in onCreate della mia MainActivity. Ho risolto il problema salvando lo stato del frammento del backstack nell'attività principale. Grazie per la risposta. – krishna

Problemi correlati