Почему мы можем вызвать getActivity() в onCreateView, который выполняется до onActivityCreated?

Я действительно путаюсь с Fragment жизненным циклом, особенно на время вызова getActivity(). Иногда вы не можете получить Activity на getActivity(). И это всегда вызывало некоторые загадочные ошибки.
Спасибо, что любой может решить загадку.

Ответ 1

getActivity() может быть нулевым, пока ваш фрагмент находится в процессе подготовки и собирается быть готовым.

Жизненный цикл фрагмента связан с методами обратного вызова. Этот метод будет вызываться где-то во времени, пока фрагмент готовится.

  • Fragment.onActivityCreated(Bundle) - это место, где активность фрагмента не будет нулевой, т.е. getActivity() будет действительным экземпляром. Это происходит после onCreateView(), хотя

Ваша самая безопасная ставка для существования активности:

Ответ 2

Согласно текущей документации (декабрь 2018 г.), это показывает, что onAttach() вызывается в самом начале, перед onCreate() и onCreateView(). В этих методах должно быть безопасно getActivity().

Fragment lifecycle


В документации фрагмента Support v4 для onActivityCreated() говорится, что этот метод:

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

Важной частью здесь является то, что "действие было создано", т.е. Activity.onCreate() завершил выполнение. До этого момента мы все еще в рамках этого метода.

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