РЕДАКТИРОВАТЬ: В соответствии с Ian Lake в Twitter (см. https://twitter.com/ianhlake/status/1193964829519667202), тот факт, что FragmentActivity
пытается отправить onActivityCreated
в onStart
не имеет значения,потому что независимо от того, что происходит, FragmentManager все равно отправляет его при переходе от onCreate
к onStart
.
case Fragment.CREATED:
// We want to unconditionally run this anytime we do a moveToState that
// moves the Fragment above INITIALIZING, including cases such as when
// we move from CREATED => CREATED as part of the case fall through above.
if (newState > Fragment.INITIALIZING) {
fragmentStateManager.ensureInflatedView();
}
if (newState > Fragment.CREATED) {
fragmentStateManager.createView(mContainer);
fragmentStateManager.activityCreated(); // <--
fragmentStateManager.restoreViewState();
Так что то, что я сказал ниже, на самом деле неверно.
Очевидно, использование onActivityCreated
внутри фрагмента эквивалентно использованию onViewCreated
.
Но это также означает, что вам не следует полагаться на onActivityCreated
, чтобы узнать, действительно ли была создана ваша активность, потому что она вызываетсябольше, чем при создании действия.
Фрагменты сбивают с толку.
ОРИГИНАЛЬНЫЙ ОТВЕТ:
Возможно ли, что onCreateView () вызван, но onActivityCreated () не вызван?
ОБНОВЛЕНИЕ: Нет, это невозможно.
ОРИГИНАЛ: Да, в FragmentPagerAdapter
они используют FragmentTransaction.detach
/ FragmentTransaction.attach
, что приводит к разрушению вида, но Фраgment остается живым (остановлен, но не уничтожен).
В этом случае .attach()
работает onCreateView
, но не onActivityCreated
.
Обычная практика - присоединять LiveDataнаблюдатели в onActivityCreated (), так что я думаю, что есть существенная разница между onActivityCreated () и onCreateView ()?
ОБНОВЛЕНИЕ: это не имеет значения, хотя onViewCreated
все еще яснее .
ОРИГИНАЛ: Это на самом деле плохая практика , и должно быть сделано в onViewCreated
, обеспечивая getViewLifecycleOwner()
в качествевладелец жизненного цикла.
Хотя при взгляде на диаграмму из официальных документов Android кажется, что onActivityCreated () всегда вызывается после onCreateView () и нет различий?
ОБНОВЛЕНИЕ: Несмотря на то, что FragmentActivity
пытается отправить его только один раз, все фрагменты всегда проходят onActivityCreated
, потому что именно так работает FragmentManager.
ORIGINAL: Это не всегда вызывается после onCreateView
, на самом деле это более-менееназывается "до onStart
, но только один раз".
/**
* Dispatch onStart() to all fragments.
*/
@Override
protected void onStart() {
super.onStart();
mStopped = false;
if (!mCreated) {
mCreated = true;
mFragments.dispatchActivityCreated(); // <---
}
mFragments.noteStateNotSaved();
mFragments.execPendingActions();
// NOTE: HC onStart goes here.
mFragments.dispatchStart();
}
ОБНОВЛЕНИЕ: но, очевидно, это не имеет значения для FragmentManager, потому что это происходитCREATED -> ACTIVITY_CREATED -> STARTED
в любом случае.