Различия и использование onCreate (), onCreateView () и onActivityCreated () во фрагментах

329

Каковы различия между onCreate(), onCreateView()и onActivityCreated()во фрагментах и что бы каждый из них будет использоваться?

Фарбод Саламат-Заде
источник
Смотрите также: stackoverflow.com/questions/27227906/…
Брэд Ларсон
@BradLarson Я не понимаю, почему это было закрыто. Этот вопрос оказался относительно популярным и отличается от ссылки, указанной в вашем комментарии. Этот вопрос задает вопрос о различии между тремя различными методами и о том, как они сравниваются друг с другом, но в вопросе, который вы указали в своем комментарии, упоминаются только два из этих методов.
Фарбод Саламат-Заде
@BradLarson Справедливо и замечательно. Теперь, хотя у меня есть понимание, могу ли я написать ответ, который лучше сравнивает три метода, ссылаясь на ссылки для получения дополнительной информации?
Фарбод Саламат-Заде
2
@ FarbodSalamat-Zadeh - Конечно. Я снова открыл вопрос, если вы думаете, что можете дать лучший ответ. Я просто не хотел оставлять это без ответа, если бы мог.
Брэд Ларсон

Ответы:

395

OnCreate ():

onCreate()Метод в Fragmentэто вызывается после того , Activity'sonAttachFragment() , но до этого FragmentonCreateView().
В этом методе вы можете назначать переменные, получать Intentдополнения и все, что не связано с иерархией View (т.е. неграфические инициализации). Это потому, что этот метод может быть вызван, когда Activitys onCreate()не закончен, и поэтому попытка получить доступ к иерархии View здесь может привести к сбою.

onCreateView ():

После того, как onCreate()вызывается (в Fragment), вызывается Fragment's' onCreateView(). Вы можете назначить свои Viewпеременные и выполнить любую графическую инициализацию . Ожидается, что вы вернете a Viewиз этого метода, и это основное представление пользовательского интерфейса, но если вы Fragmentне используете макеты или графику, вы можете вернуться null(происходит по умолчанию, если вы не переопределяете).

onActivityCreated ():

Как следует из названия, это вызывается после того Activity, onCreate()как завершено . Он вызывается после onCreateView()и в основном используется для окончательной инициализации (например, для изменения элементов пользовательского интерфейса).


Подводя итог ...
... они все вызваны, Fragmentно вызваны в разное время. Называется первым, для выполнения каких - либо неграфические инициализацый. Затем вы можете назначить и объявить любые переменные, в которых вы хотите использовать . После этого используйте для выполнения всех финальных инициализаций, которые вы хотите выполнить после завершения всего процесса.
onCreate()ViewonCreateView()onActivityCreated()


Если вы хотите просмотреть официальную документацию по Android, ее можно найти здесь:
- - -onCreate()
onCreateView()
onActivityCreated()

Здесь также есть несколько иные, но менее разработанные вопросы / ответы здесь, о переполнении стека:

Фарбод Саламат-Заде
источник
6
Я думал, что реализую неграфические инициализации в onCreate (), чтобы они не вызывались снова при повороте экрана. Оказывается, мне нужно вызывать фрагмент.setRetainInstance (true), иначе и onCreate (), и onCreateView () вызываются снова при повороте экрана.
Чертовы овощи
В onCreateView () это безопасно для доступа к иерархии представлений?
Коди
@ Коди, я так считаю - доступ к иерархии представлений является точной целью onCreateView.
Фарбод Саламат-Заде
1
Однако onCreate () действия может не завершиться, пока onActivityCreated ()? Есть ли какой-либо шанс сбоя в onCreateView для доступа к иерархии представлений? Я не уверен, в чем разница между onCreateView () / onActivityCreated ()
Коди
1
Стоит отметить (по крайней мере, с AppCompatActivity), что при повторном создании действия (например, после свертывания и уничтожения) фрагменты onCreate () будут вызываться до завершения действий onCreate () и super.onCreate (). Это может быть проблемой, если вы используете что-то вроде Dagger и вам нужно получить доступ к чему-либо в родительском действии, которое вводится. Одним из решений этого является помещение кода в onActivityCreated (), который вызывается всегда вызывается из onCreate () вызывается.
Николас
144

Для тех, кто ищет краткий, наглядный ответ:

введите описание изображения здесь https://hanaskuliah.wordpress.com/2015/12/07/android-5-development-part-6-fragment/


И,

введите описание изображения здесь

криминальное чтиво
источник
21
Согласовано. Comic Sans необходим для таких вещей
Kartik Chugh
1
Это первый раз, когда я вижу 3 разных шрифта на одной диаграмме, и теперь моя жизнь кажется полной.
Гил Санд
Когда именно фрагмент может перезапуститься?
Саураб
1
Как получается, что фрагмент не воссоздан, когда его процесс мертв? AFAIK, только состояние задачи сохранено как пакет, и это заново созданное приложение снова выводится на передний план.
выход
6

onActivityCreated () - устарело

onActivityCreated()теперь осуждается как версия фрагментов 1.3.0-alpha02

Метод onActivityCreated () теперь устарел. Код, касающийся представления фрагмента, должен быть выполнен в onViewCreated () (который вызывается непосредственно перед onActivityCreated ()), а другой код инициализации должен быть в onCreate (). Чтобы получить обратный вызов, в частности, когда onCreate () действия завершен, LifeCycleObserver должен быть зарегистрирован в жизненном цикле действия в onAttach () и удален после получения обратного вызова onCreate ().

Подробную информацию можно найти здесь

Гастон Сайлен
источник