47

Sto usando FragmentActivity e Fragments.Dopo la rotazione, onCreate() Frammento viene chiamato prima onCreate() FragmentActivity

All'avvio dell'applicazione:

FragmentActivity onCreate() <------ 
FragmentActivity onStart() 
FragmentActivity onResume() 
Fragment onAttach() 
Fragment onCreate() <------ 
Fragment onCreateView() 
Fragment onActivityCreated() 
Fragment onStart() 
Fragment onResume() 

Tutto è OK, FragmentActivity onCreate() viene chiamato prima Fragment onCreate(). E quando ho ruotare:

Fragment onPause() 
FragmentActivity onPause() 
Fragment onStop() 
FragmentActivity onStop() 
Fragment onDestroyView() 
Fragment onDestroy() 
Fragment onDetach() 
FragmentActivity onDestroy() 
--- 
Fragment onAttach() 
Fragment onCreate() <---------- 
FragmentActivity onCreate() <--------- 
Fragment onCreateView() 
Fragment onActivityCreated() 
Fragment onStart() 
FragmentActivity onStart() 
FragmentActivity onResume() 
Fragment onResume() 

Fragment onCreate() viene chiamato prima FragmentActivity onCreate(). Perché è incoerente?

In FragmentActivity onCreate() Genero alcuni dati, che si ottiene Framment onCreate(). A causa di questo strano comportamento ho dovuto spostare il mio codice da Fragment onCreate() a Fragment onCreateView() per essere sicuro che i miei dati fossero stati generati prima.

Sto usando FragmentStatePagerAdapter per contenere Frammenti, forse questa è la ragione?

+0

Allora, che cosa sei tu? soluzione? – levi

+0

@levi Compila le tue Viste con i dati nel metodo di Frammento di onActivityCreated(). Oppure ripensare la tua architettura, nella maggior parte dei casi non è necessario ottenere i dati dall'attività dell'host. E utilizzare i caricatori se si dispone di ListView/RecyclerView con dati dinamici. Questa è stata la mia soluzione finale perché avevo List in ogni frammento. È anche possibile utilizzare la libreria bus di messaggi (EventBus, Otto, ...) per avere un'architettura ancora più pulita. – AppiDevo

risposta

56

Non si deve contare su un'attività valida fino alla chiamata onActivityCreated() nel ciclo di vita di Frammento.

Chiamato quando l'attività del frammento è stata creata e la gerarchia della vista di questo frammento è stata creata. Può essere utilizzato per eseguire l'inizializzazione finale una volta che questi pezzi sono stati posizionati, come il recupero di viste o il ripristino dello stato.

I motivi esatti per cui l'ordine di ricostruzione non è lineare, non posso dirvelo. È probabilmente più efficiente consentire a ciascun componente di riavviarsi al proprio ritmo piuttosto che forzare un ordine rigido. Ad esempio, preferisco che il mio LoaderManager inizi il prima possibile e ci preoccuperemo del layout per il suo contenuto successivamente.

(Mi piace un buon schema.)

enter image description here

+0

Il diagramma dolce, rende davvero chiaro e porta a casa il punto. –

+0

Nice Diagram, e anche una buona illustrazione – AshuKingSharma

+0

È possibile avviare Loders in onActivityCreated() a causa di un bug, non prima. https://code.google.com/p/android/issues/detail?id=183783 – AppiDevo

25

Frammenti vengono ripristinati durante l'attività del onCreate(). È importante sottolineare che, tuttavia, vengono ripristinati nella classe Attività di base onCreate(). Pertanto, se chiami prima il super.onCreate(), tutto il resto del tuo metodo onCreate() verrà eseguito dopo il ripristino dei frammenti.

Una possibile soluzione, allora è quello di ripristinare il vostro stato o calcolare che cosa mai i dati si tratta del frammento avrà bisogno PRIMA si chiama super.onCreate()

Il ciclo di vita è simile al seguente:

ACTIVITY onCreate (pre-super) 
FRAGMENT onAttach 
ACTIVITY onCreate (post-super) 

Quindi fai qualcosa del genere:

@Override 
public void onCreate(final Bundle savedInstanceState) 
{ 
    Log.d(TAG, "ACTIVITY onCreate (pre-super)"); 
    // Do your processing here 
    super.onCreate(savedInstanceState); // Fragments will be restored here 
    Log.d(TAG, "ACTIVITY onCreate (post-super)"); 
} 
+3

Non posso ringraziarti abbastanza per questa risposta. Stavo cercando 2 giorni interi per una risposta a un tale problema – user3213851

+3

Sei un eroe .... – Joakim

+1

Grazie! a mio parere, questa dovrebbe essere la risposta accettata – feresr

Problemi correlati