web-dev-qa-db-fra.com

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 va bien, FragmentActivity onCreate () est appelé avant Fragment onCreate (). Et quand je tourne:

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 () est appelé avant FragmentActivity onCreate (). Pourquoi est-ce incohérent?

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

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

55
AppiDevo

Vous ne devez pas compter sur une activité valide avant l'appel 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 a été instanciée. Il peut être utilisé pour effectuer l'initialisation finale une fois que ces éléments sont en place, tels que 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 le dire. Il est probablement plus efficace de permettre à chaque composant de redémarrer à son 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 nous nous préoccuperons de la mise en page de son contenu plus tard .

(J'adore un bon diagramme.)

enter image description here

63
Sam

Les fragments sont restaurés pendant l'activité onCreate() de l'activité. Mais surtout, ils sont restaurés dans onCreate() de la classe Activity de base. Ainsi, si vous appelez d'abord super.onCreate(), tout le reste de votre méthode onCreate() s'exécutera après la restauration de vos fragments.

Une solution possible est alors de restaurer votre état ou de calculer les données dont votre fragment aura besoin [~ # ~] avant [~ # ~] vous appelez super.onCreate()

Le cycle de vie ressemble à ceci:

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