Різниця та використання фрагментів onCreate (), onCreateView () та onActivityCreate () у фрагментах


329

Які відмінності між onCreate(), onCreateView()і onActivityCreated()у фрагментах і що б кожен з них буде використовуватися?



@BradLarson Я не розумію, чому це було закрито. Це виявилося досить популярним питанням і відрізняється від посилання, зазначеного у вашому коментарі. Це питання вимагає різниці між трьома різними методами та їх порівнянням, але питання, яке ви пов’язали у своєму коментарі, згадує лише два з цих методів.
Farbod Salamat-Zadeh

@BradLarson Ярмарок досить і добре помічений. Тепер, якщо я розумію, чи не можу я написати відповідь, яка краще порівнює три методи, посилаючись на посилання на додаткові деталі?
Farbod Salamat-Zadeh

2
@ FarbodSalamat-Zadeh - Звичайно. Я знову відкрив питання, якщо ви думаєте, що можете надати кращу відповідь. Я просто не хотів залишати це без відповіді, якщо міг.
Бред Ларсон

Відповіді:


394

onCreate ():

onCreate()Метод в Fragmentце викликається після того , Activity'sonAttachFragment() , але до цього FragmentonCreateView().
У цьому методі ви можете призначити змінні, отримати Intentдодаткові дані та все інше, що не передбачає ієрархію перегляду (тобто не графічні ініціалізації). Це тому, що цей метод можна викликати, коли Activityімена onCreate()не закінчено, і тому спроба отримати доступ до ієрархії перегляду тут може призвести до збою.

onCreateView ():

Після onCreate()виклику (в Fragment), називається Fragments onCreateView(). Ви можете призначити свої Viewзмінні та зробити будь-які графічні ініціалізації . Очікується, що ви повернете a Viewз цього методу, і це основний перегляд інтерфейсу користувача, але якщо ваш файл Fragmentне використовує жодних макетів чи графіки, ви можете повернутися null(відбувається за замовчуванням, якщо ви не переопрацюєте).

onActivityCreate ():

Як вказується назва, це називається після Activity«s onCreate()завершена . Він називається після onCreateView(), і в основному використовується для остаточної ініціалізації (наприклад, для зміни елементів інтерфейсу).


Підводячи підсумок ...
... всі вони називаються, Fragmentале називаються в різний час.
Перший onCreate()називається для виконання будь-яких не графічних ініціалізацій. Далі ви можете призначити та оголосити будь-які Viewзмінні, які ви хочете використовувати onCreateView(). Потім onActivityCreated()виконайте будь-які остаточні ініціалізації, які ви хочете зробити, як тільки все завершиться.


Якщо ви хочете переглянути офіційну документацію на Android, її можна знайти тут:
- - -onCreate()
onCreateView()
onActivityCreated()

Тут також є кілька дещо інших, але менш розвинених питань / відповідей на Stack Overflow:


6
Я думав, що я буду реалізовувати не графічні ініціалізації в onCreate (), щоб вони не були викликані знову при поверненні екрана. Виявляється, я повинен викликати fragment.setRetainInstance (true), інакше і onCreate (), і onCreateView () викликаються знову при поверненні екрана.
Чортові овочі

Чи є безпечним для доступу до ієрархії подання перегляд onCreateView ()?
Коді

@Cody Я так вважаю - саме доступ до ієрархії перегляду є саме цільовим призначенням onCreateView.
Фарбод Саламат-Заде

1
Однак активність onCreate () може не закінчитися, поки onActivityCreate ()? Чи є такий шанс вийти з ладу в onCreateView для доступу до ієрархії перегляду? Я не впевнений, у чому різниця між onCreateView () / on onActivityCreate ()
Cody

1
Одне, що слід зазначити (принаймні, з AppCompatActivity), - це те, що коли діяльність буде відтворена (наприклад, після мінімізації та вбиття), фрагменти onCreate () будуть викликані до того, як будуть завершені дії onCreate () та super.onCreate (). Це може бути проблемою, якщо ви використовуєте щось на кшталт Dagger і вам потрібно отримати доступ до чогось у батьківській діяльності, яка вводиться. Одним з варіантів цього є введення коду в onActivityCreate (), який називається завжди викликається onCreate ().
Микола

144

Для всіх, хто шукає стислу, образотворчу відповідь:

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


І,

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


21
Домовились. Comic Sans необхідні для таких речей
Kartik Chugh

1
Вперше я бачу 3 різні шрифти на одній діаграмі, і я зараз якось відчуваю себе повноцінним.
Гіль Санд

Коли саме фрагмент міг перезапуститись?
Саураб

1
Чому фрагмент не буде створений заново, коли процес помер? AFAIK, лише стан завдань, що зберігається як пакет, і його заново створено додаток знову виноситься на перший план.
stdout

6

onActivityCreate () - застарілий

onActivityCreated()тепер застаріло як фрагменти версії 1.3.0-alpha02

Метод onActivityCreate () тепер застарілий. Код, що торкається виду фрагмента, повинен здійснюватися в onViewCreate () (який викликається безпосередньо перед onActivityCreate ()), а інший код ініціалізації повинен бути в onCreate (). Для отримання зворотного дзвінка конкретно після завершення onCreate () завершення, LifeCycleObserver повинен бути зареєстрований у життєвому циклі діяльності в onAttach () та видалений, як тільки буде отримано зворотний виклик onCreate ().

Детальну інформацію можна знайти тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.