59 votes

Après la rotation, onCreate() Fragment est appelé avant onCreate() FragmentActivity

J'utilise FragmentActivity et Fragments.

Lorsque l'application démarre :

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

Tout est OK, FragmentActivity onCreate() est appelé avant Fragment onCreate(). Et lorsque je fais pivoter :

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()

Le Fragment onCreate() est appelé avant le FragmentActivity onCreate(). Pourquoi cela est-il incohérent ?

Dans FragmentActivity onCreate(), je génère des données que Fragment onCreate() récupère. En raison de ce comportement étrange, j'ai dû déplacer mon code du Fragment onCreate() au Fragment onCreateView() pour être sûr que mes données avaient été générées auparavant.

J'utilise FragmentStatePagerAdapter pour contenir les fragments, c'est peut-être la raison ?

66voto

Sam Points 47925

Vous ne devez pas compter sur une activité valide jusqu'à ce que les onActivityCreated() dans le cycle de vie du fragment.

Appelé lorsque l'activité du fragment a été créée et que la hiérarchie de vues de ce fragment est instanciée. Il peut être utilisé pour faire l'initialisation finale une fois que ces pièces sont en place, comme la récupération des vues ou la restauration de l'état.

Les raisons exactes pour lesquelles l'ordre de reconstruction n'est pas linéaire, je ne peux pas vous les dire. Il est probablement plus efficace de permettre à chaque composant de redémarrer à son propre rythme plutôt que de forcer un ordre rigide. Par exemple, je préfère que mon LoaderManager démarre le plus tôt possible et que nous nous occupions de la mise en page de son contenu. plus tard .

(J'aime un bon diagramme.)

enter image description here

32voto

Adam Points 6342

Les fragments sont restaurés pendant l'Activité onCreate() . Cependant, il est important de noter qu'ils sont restaurés dans la classe Activity de base. onCreate() . Ainsi, si vous appelez super.onCreate() d'abord, tout le reste de votre onCreate() s'exécutera après que vos Fragments aient été restaurés.

Une solution possible est alors de restaurer votre état ou de calculer les données dont vos fragments auront besoin. AVANT vous appelez super.onCreate()

Le cycle de vie se présente comme suit :

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

Alors faites quelque chose comme ça :

@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)" );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X