Когда вызывается фрагмент onActivityCreated - PullRequest
2 голосов
/ 06 ноября 2019

До компонента архитектуры Google и LiveData я не обратил внимания на onActivityCreated() обратный вызов. Я читал об этом здесь, в SOF, а также в документации, и до сих пор не могу понять поведение.

Из одного из ответов SOF:

Как следует из названия, это вызывается послеОперация onCreate () завершена.

  • При каких условиях onActivityCreated() вызывается , а когда onActivityCreated() не вызывается ?

  • Возможно ли, что onCreateView() вызван, но onActivityCreated() не вызван?

Обычно принято прикреплять LiveData наблюдателей в onActivityCreated(), так что я думаю, что между onActivityCreated() и onCreateView()?

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

Что-то здесь сбивает с толку.

enter image description here

1 Ответ

2 голосов
/ 08 ноября 2019

РЕДАКТИРОВАТЬ: В соответствии с 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 в любом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...