После поворота, onCreate() Фрагмент вызывается перед onCreate() FragmentActivity - программирование
Подтвердить что ты не робот

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

Я использую FragmentActivity и Fragments.

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

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

Все в порядке, FragmentActivity onCreate() вызывается перед фрагментом 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()

Фрагмент onCreate() вызывается перед FragmentActivity onCreate(). Почему это противоречиво?

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

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

4b9b3361

Ответ 1

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

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

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

(Мне нравится хорошая диаграмма.)

enter image description here

Ответ 2

Фрагменты восстанавливаются во время Activity onCreate(). Важно отметить, что они восстанавливаются в базовом классе Activity 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)" );
}