method - support fragment android




Comprensione setRetainInstance(booleano) di Fragment (3)

Prima di tutto, controlla il mio post su Fragment conservati. Potrebbe aiutare.

Ora per rispondere alle tue domande:

Il frammento mantiene anche il suo stato di visualizzazione , o verrà ricreato sul cambiamento di configurazione - che cosa è esattamente "trattenuto"?

Sì, lo stato di Fragment verrà mantenuto attraverso la modifica della configurazione. In particolare, "mantenuto" significa che il frammento non verrà distrutto in caso di modifiche alla configurazione. Cioè, il Fragment verrà mantenuto anche se la modifica della configurazione provoca la distruzione Activity sottostante.

Il frammento verrà distrutto quando l'utente lascia l'attività?

Proprio come le Activity s, Fragment possono essere distrutti dal sistema quando le risorse di memoria sono basse. Se i tuoi frammenti mantengono il loro stato di istanza attraverso le modifiche alla configurazione, non avranno alcun effetto sul fatto che il sistema distrugga i Fragment una volta che lasci l' Activity . Se si abbandona l' Activity (ovvero premendo il pulsante home), Fragment s può o non può essere distrutto. Se si abbandona l' Activity premendo il pulsante indietro (quindi, chiamando finish() e distruggendo efficacemente l' Activity ), anche tutti i Fragment s associati Activity verranno distrutti.

Perché non funziona con i frammenti nello stack posteriore?

Ci sono probabilmente molte ragioni per cui non è supportato, ma la ragione più ovvia per me è che l' Activity contiene un riferimento a FragmentManager e FragmentManager gestisce il backstack. Cioè, non importa se si sceglie di conservare i Fragment o meno, l' Activity (e quindi il backstack di FragmentManager ) verrà distrutta in caso di modifica della configurazione. Un altro motivo per cui potrebbe non funzionare è perché le cose potrebbero diventare complicate se allo stesso backstack fossero consentiti sia frammenti trattenuti che frammenti non conservati.

Quali sono i casi d'uso in cui ha senso usare questo metodo?

I frammenti conservati possono essere molto utili per propagare le informazioni di stato, in particolare la gestione dei thread, attraverso le istanze di attività. Ad esempio, un frammento può servire come host per un'istanza di Thread o AsyncTask , gestendone l'operazione. Vedere il mio post sul blog su questo argomento per ulteriori informazioni.

In generale, lo tratterei in modo simile all'utilizzo di onConfigurationChanged con un'attività ... non utilizzarlo come bandaid solo perché sei troppo pigro per implementare / gestire correttamente una modifica dell'orientamento. Usalo solo quando è necessario.

A partire dalla documentazione:

public void setRetainInstance (boolean retain)

Controlla se l'istanza di un frammento viene mantenuta attraverso la ricreazione di attività (ad esempio da una modifica alla configurazione). Questo può essere usato solo con frammenti non nello stack posteriore. Se impostato, il ciclo di vita del frammento sarà leggermente diverso quando viene ricreata un'attività:

  • onDestroy () non verrà chiamato (ma onDetach () lo sarà ancora, perché il frammento viene staccato dalla sua attività corrente).
  • onCreate (Bundle) non verrà chiamato poiché il frammento non viene ricreato.
  • onAttach (Activity) e onActivityCreated (Bundle) saranno ancora chiamati.

Ho alcune domande:

  • Anche il frammento conserva la sua vista o verrà ricreato in caso di modifica della configurazione? Cosa viene esattamente "trattenuto"?

  • Il frammento verrà distrutto quando l'utente lascia l'attività?

  • Perché non funziona con i frammenti nello stack posteriore?

  • Quali sono i casi d'uso in cui ha senso usare questo metodo?


SetRetainInstance (true) consente al tipo di frammento di sopravvivere. I suoi membri verranno mantenuti durante la modifica della configurazione come la rotazione. Ma può ancora essere ucciso quando l'attività viene uccisa in background. Se l'attività di contenimento in background viene uccisa dal sistema, è necessario che instanceState venga salvato dal sistema gestito correttamente da SaveInstanceState. In altre parole, verrà sempre chiamato onSaveInstanceState. Sebbene onCreateView non venga chiamato se SetRetainInstance è true e il frammento / l'attività non viene ancora ucciso, verrà comunque chiamato se viene ucciso e tentato di essere richiamato.

Ecco alcune analisi dell'attività Android / frammento spero che aiuti. http://ideaventure.blogspot.com.au/2014/01/android-activityfragment-life-cycle.html


setRetaininstance è utile solo quando l' activity viene distrutta e ricreata a causa di una modifica della configurazione poiché le istanze vengono salvate durante una chiamata a onRetainNonConfigurationInstance . Cioè, se si ruota il dispositivo, i frammenti conservati rimarranno lì (non vengono distrutti e ricreati.) Ma quando il runtime uccide l'attività per recuperare risorse, non viene lasciato nulla. Quando premi il pulsante Indietro e esci dall'attività, tutto viene distrutto.

Di solito uso questa funzione per salvare l'orientamento cambiando Time.Say ho scaricato un mucchio di Bitmap dal server e ognuno è 1MB, quando l'utente ruota accidentalmente il suo dispositivo, di certo non voglio fare di nuovo tutto il lavoro di download. Quindi Creo un Fragment contenente le mie bitmap e lo aggiungo al gestore e chiamo setRetainInstance , tutte le bitmap sono ancora lì anche se l'orientamento dello schermo cambia.







android-fragments