2013-03-06 14 views
6

Ho un FragmentActivity con contenitore, dove inserisco Fragment con ViewPager. In ViewPager Ho 3 Fragment s:I frammenti in ViewPager vengono ricreati

[MainActivity] 
    [ViewPagerFragment] 
     [Fragment1][Fragment2][Fragment3] 

Quando l'utente fa clic su un pulsante sul Fragment1/Fragment2/Fragment3, sostituisco il ViewPagerFragment con OtherFragment, quindi la gerarchia simile a questa:

[MainActivity] 
    [OtherFragment] 

Quando Ho colpito Indietro pulsante, ViewPagerFragment viene ricreato, così come il suo nidificato Fragment s (Fragment1/Fragment2/Fragment3).

C'è un modo per salvare lo stato di ViewPagerFragment e i suoi frammenti nidificati? In modo che i frammenti manterranno il loro stato e non verranno ricreati?

Ho impostato setRetainInstance(true) per ViewPagerFragment, ma sembra che non abbia effetto.

risposta

16

appena impostato in questo modo: - in cui l'argomento è il numero di frammenti nel ViewPager

mViewPager.setOffscreenPageLimit (3);

ViewPager è piuttosto zelante nel chiudere le cose che non sta attualmente utilizzando, e questo è esattamente ciò che sta accadendo qui. Il comportamento predefinito è che ViewPager "trattiene" una pagina su entrambi i lati della pagina visualizzata e distrugge il resto. Quindi nella tua vista di 3 pagine, la pagina 3 viene distrutta quando si seleziona la pagina 1, quindi quando viene riselezionata la pagina 2 viene ricreata la pagina 3. Come avrai notato, la pagina 2 ha solo onCreate (..) chiamato una volta perché è sempre adiacente a, o è, la pagina attualmente selezionata.

Per risolvere questo problema, è sufficiente impostare ViewPager.setOffscreenPageLimit (2). Quindi il ViewPager manterrà tutti i tuoi frammenti. Ovviamente questa non è una buona idea per un gran numero di Frammenti, ma per il tuo caso dovrebbe andare bene.

+0

Potrebbero verificarsi problemi quando le risorse di sistema si scaricano. Alcuni punti di vista all'interno del tuo frammento, o il frammento stesso, verranno abbattuti per spendere quelle risorse altrove. – sudocoder

Problemi correlati