Я действительно путаюсь с Fragment
жизненным циклом, особенно на время вызова getActivity()
. Иногда вы не можете получить Activity
на getActivity()
. И это всегда вызывало некоторые загадочные ошибки.
Спасибо, что любой может решить загадку.
Почему мы можем вызвать getActivity() в onCreateView, который выполняется до onActivityCreated?
Ответ 1
getActivity()
может быть нулевым, пока ваш фрагмент находится в процессе подготовки и собирается быть готовым.
Жизненный цикл фрагмента связан с методами обратного вызова. Этот метод будет вызываться где-то во времени, пока фрагмент готовится.
- Fragment.onActivityCreated(Bundle) - это место, где активность фрагмента не будет нулевой, т.е.
getActivity()
будет действительным экземпляром. Это происходит послеonCreateView()
, хотя
Ваша самая безопасная ставка для существования активности:
Ответ 2
Согласно текущей документации (декабрь 2018 г.), это показывает, что onAttach()
вызывается в самом начале, перед onCreate()
и onCreateView()
. В этих методах должно быть безопасно getActivity()
.
В документации фрагмента Support v4 для onActivityCreated()
говорится, что этот метод:
Вызывается, когда действие фрагмента было создано, и была создана эта иерархия представления фрагмента.
Важной частью здесь является то, что "действие было создано", т.е. Activity.onCreate()
завершил выполнение. До этого момента мы все еще в рамках этого метода.
В этом можно убедиться, посмотрев исходный код FragmentActivity.onCreate()
Вы можете следить за процессом присоединения фрагментов к действию в начале метода, затем восстановлением состояния фрагмента и т.д. И т.д. Таким образом, действие должно быть действительным в все эти места, но технически это не закончено со всем процессом создания.