8

Non riesco a capire bene questo business del ciclo di vita dei frammenti.Perché il mio frammento suCreate viene chiamato estesamente ogni volta che sfoglio le mie applicazioni viewPager?

Ho una finestra di scorrimento orizzontale standard di 3 pagine Visualizza il layout del cercapersone per una sezione "visualizza dettagli" della mia app. Inizio la mia app nella pagina centrale dei tre. Il mio FragmentActivity imposta la pagina in pagina 1.

mPager.setCurrentItem(1); //default to center page, current data view fragment 

Sto usando il FragmentStatePagerAdapter perché usando il FragmentPagerAdapter schiantato la mia app, a volte, quando di ritorno da uno stato sospeso, per esempio, e questo era il modo più rapido per lavorarci intorno per ora. Sembra funzionare, ma sospetto che l'aspetto dello Stato sia ciò che potrebbe essere la causa del mio problema qui, forse.

Quindi all'inizio pensavo che avrei dovuto fare in modo che ogni frammento facesse il lavoro di ottenere i dati da un servizio di riposo e lo mostrasse in un elenco, ma non ne sono più così sicuro.

Ho provato a eseguire un'attività asincrona unica per recuperare i dati in ciascuno degli eventi frammenti suCreateView. Poi, dopo aver letto di più sul ciclo di vita del frammento, sono passato a onCreate, avendo notato che onCreateView veniva chiamato piuttosto pesantemente, il che a sua volta creava un'app avida che troppo spesso richiedeva dati sul filo.

Passare a onCreate non ha cambiato nulla. OnCreate viene ancora chiamato tanto quanto onCreateView per i 2 frammenti adiacenti.

La cosa strana è che il frammento che ho impostato per essere il primo da visualizzare in Fragment Activity ottiene solo il onCreate chiamato la volta sola.

Qualcosa non sembra proprio qui.

In questo momento sto pensando che dovrei dichiarare l'attività del frammento principale e chiamare tutte le attività asincrone per recuperare i dati che ho bisogno di visualizzare nei frammenti. Impostare i risultati delle chiamate asincrone in un oggetto di proprietà della attività di frammento genitore e poi hanno i frammenti utilizzare l'oggetto contenuto dal genitore per creare la vista lista ecc

Ma cosa succede se i compiti asincroni iniziate da genitore l'attività non finire prima di ogni frammenti onCreateView viene chiamato e l'oggetto contenuto da parte del genitore non è ancora pronto .....

firmato, confuso e frustrato

risposta

25

ViewPager è molto zelante nel spegnimento cose che non è attualmente in uso, 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 hai notato, la pagina 2 ha solo onCreate(..) chiamata una volta perché è sempre adiacente a, o è, la pagina attualmente selezionata.

Per risolvere questo, è 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

oh ya, sembra utile provarlo. quindi, hey, sparare compiti asincroni da un frammento suCreate sembra un modo standard per fare qualcosa? in questo momento sparo tre compiti asincroni separati una volta che il mio frammento Attività carica, giusto o sbagliato .... – topwik

+0

Sì, l'unico problema che potrei vedere con questo è se un utente ruota il dispositivo quando è in esecuzione AsyncTask. Non ho molta esperienza con loro comunque. Potrebbe valere la pena di verificare la classe AsyncTaskLoader, credo che le classi Loader automatizzino un sacco di cose per te. –

+0

Ho anche intrappolato in questo problema. Ora devo andare al lavoro. Grazie molto. – Durai

2

@ La soluzione di Espiandev funzionerà per il tuo caso attuale, ma hai ragione che il tuo stato è il problema. Dovresti utilizzare i metodi setArgument e/o onSaveInstanceState per salvare lo stato di Fragment (che non dovrebbe essere troppo difficile, poiché ad es., una risposta dal server può di solito essere rappresentata come una stringa) e quindi utilizzare getArgument e/o lo Bundle passato in onCreate per ripristinarlo.

In alternativa, si potrebbe avere il Activity fare il server va a prendere, e quindi chiamare setArgument per ciascuno dei vostri frammenti, e controllare gli argomenti all'interno del vostro Fragment per determinare se i dati è ancora arrivato (e se non, potenzialmente visualizzare un carico stato di qualche tipo).

Se si cura del cambio di orientamento dello schermo, this related question sarà utile anche a voi.

+0

grazie, amico. apprezzo la risposta. volevo continuare con "e se avessi molti più frammenti in questo cercapersone" .... – topwik

Problemi correlati