После поворота, onCreate() фрагмент вызывается перед onCreate () FragmentActivity


Я использую FragmentActivity и фрагменты.

при запуске приложения:

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

все в порядке, FragmentActivity onCreate () вызывается перед Fragment onCreate (). И когда я вращаюсь:

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 () вызывается перед FragmentActivity onCreate (). Почему это несовместимо?

в FragmentActivity onCreate() я генерирую некоторые данные, которые получает фрагмент onCreate (). Из-за этого странного поведения мне пришлось переехать мой код от фрагмента onCreate() до фрагмента onCreateView (), чтобы убедиться, что мои данные были сгенерированы раньше.

Я использую FragmentStatePagerAdapter для хранения фрагментов, может быть, в этом причина?

2   51   2012-12-30 22:36:35

2 ответа:

вы не должны рассчитывать на действительное до onActivityCreated() вызов в жизненном цикле фрагмента.

вызывается при создании действия фрагмента и создании экземпляра иерархии представления этого фрагмента. Он может быть использован для выполнения окончательной инициализации, как только эти части находятся на месте, такие как получение представлений или восстановление состояния.

точные причины, по которым порядок перестроения не является линейным, я не могу вам сказать. Это, наверное, больше эффективный, чтобы позволить каждому компоненту перезапускаться в своем собственном темпе, а не заставлять жесткий порядок. Например, я предпочитаю, чтобы мой LoaderManager запускался как можно раньше, и мы будем беспокоиться о макете для его содержимого позже.

(Я люблю хорошую диаграмму.)

enter image description here

фрагменты восстанавливаются во время действия onCreate(). Важно, однако, что они восстанавливаются в базовом классе активности onCreate(). Таким образом, если вы называете super.onCreate() во-первых, все остальные ваши onCreate() метод будет выполняться после восстановления фрагментов.

одним из возможных решений является восстановление вашего состояния или вычисление того, какие данные когда-либо понадобятся вашему фрагменту до вы называете super.onCreate()

жизненный цикл выглядит вот так:

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

чтобы сделать что-то вроде этого:

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