Жизненный цикл фрагмента Android при работе с одним экземпляром - PullRequest
1 голос
/ 07 июля 2011

У меня есть одно действие экземпляра и фрагмент, который я создаю в методе onCreate () и добавляю в контейнер FrameLayout в макет действия. Деятельность ничего не делает, кроме распечатки журналов. Я использую android-support-v4 lib и android 2.3.3.

Я наблюдал странное поведение жизненного цикла с этим параметром, и мне интересно, не могли бы вы помочь мне объяснить это. Я предоставлю журналы для жизненных циклов:

Первый звонок мероприятия:

    07-07 15:12:17.990 V/FragActivity( 2358): onCreate >> com.test.fragmentlife.FragActivity@44f98778
    07-07 15:12:21.010 V/FragActivity( 2358): onCreate <<
    07-07 15:12:21.020 V/LayoutFragment( 2358): onAttach > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:24.021 V/LayoutFragment( 2358): onAttach <
    07-07 15:12:24.021 V/LayoutFragment( 2358): onCreate > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:27.020 V/LayoutFragment( 2358): onCreate <
    07-07 15:12:27.020 V/LayoutFragment( 2358): onCreateView > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:30.022 V/LayoutFragment( 2358): onCreateView <
    07-07 15:12:30.030 V/LayoutFragment( 2358): onActivityCreated > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:33.030 V/LayoutFragment( 2358): onActivityCreated <
    07-07 15:12:33.030 V/LayoutFragment( 2358): onStart > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:36.030 V/LayoutFragment( 2358): onStart <
    07-07 15:12:36.040 V/FragActivity( 2358): onStart > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:12:39.041 V/FragActivity( 2358): onStart <
    07-07 15:12:39.041 V/LayoutFragment( 2358): onStop > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:42.040 V/LayoutFragment( 2358): onStop <
    07-07 15:12:42.040 V/FragActivity( 2358): onResume > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:12:45.041 V/FragActivity( 2358): onResume <
    07-07 15:12:45.041 V/LayoutFragment( 2358): onStart > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:48.040 V/LayoutFragment( 2358): onStart <
    07-07 15:12:48.040 V/LayoutFragment( 2358): onResume > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:12:51.042 V/LayoutFragment( 2358): onResume <

Первый вопрос: почему метод onStop () фрагмента при создании действия? Фрагмент хорошо отображается на экране.

После этого я перезапускаю действие, вызывая намерение, вызывая метод lNidcycle onNewIntent () для действия.

    07-07 15:13:17.220 V/LayoutFragment( 2358): onPause > LayoutFragment{44f467c8 #0 id=0x7f070000}
    07-07 15:13:20.220 V/LayoutFragment( 2358): onPause <
    07-07 15:13:20.230 V/FragActivity( 2358): onPause > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:13:23.231 V/FragActivity( 2358): onPause <
    07-07 15:13:23.231 V/FragActivity( 2358): onNewIntent > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:13:26.231 V/FragActivity( 2358): onNewIntent <
    07-07 15:13:26.231 V/FragActivity( 2358): onResume > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:13:29.230 V/FragActivity( 2358): onResume <

Второй вопрос: почему метод onResume () фрагмента не вызывается? Это все еще видно на экране. Насколько я знаю, методы активности и жизненного цикла должны идти рука об руку ...

После этого я перезапускаю упражнение второй раз:

    07-07 15:13:42.140 V/FragActivity( 2358): onPause > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:13:45.143 V/FragActivity( 2358): onPause <
    07-07 15:13:45.143 V/FragActivity( 2358): onNewIntent > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:13:48.144 V/FragActivity( 2358): onNewIntent <
    07-07 15:13:48.150 V/FragActivity( 2358): onResume > com.test.fragmentlife.FragActivity@44f98778
    07-07 15:13:51.151 V/FragActivity( 2358): onResume <

Теперь методы жизненного цикла фрагментов вообще не запускаются .. как это?

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Я не могу ответить на вопрос 1, хотя я также заметил такое поведение, но я редко выполняю большую работу в своих методах onStop (я предпочитаю onPause и onResume), я могу помочь с вашим вторым вопросом.

Проблема здесь (которая определенно является ошибкой Google) является либо проблемой FragmentActivity, либо жизненным циклом Activity в целом (в зависимости от того, как вы на это смотрите).

По сути, FragmentActivity переводит свои фрагменты в возобновленное состояние не в методе onResume (как может подумать обычно здравомыслящий человек), а в методе onPostResume. Это все хорошо, за исключением того, что метод onPostResume никогда не вызывается в действии singleIntstance / singleTask, когда действие вызывается с помощью onNewIntent.

Итак, что я сделал (импортировав код пакета поддержки, а не просто банку), изменил FragmentActivity следующим образом ...

//this boolean is only ever set to true in onNewIntent
private boolean mResumeNeedsToDoDispatch = false; 

/**
 * Ensure any outstanding fragment transactions have been committed.
 */
@Override
protected void onResume() {
    super.onResume();
    mResumed = true;

    //Check if onNewIntent was called. If so, dispatch resumes to fragments now
    if (mResumeNeedsToDoDispatch) {
        mResumeNeedsToDoDispatch = false;
        mFragments.dispatchResume();
    }

    mFragments.execPendingActions();
}


/**
 * Google, I think you forgot this #(
 */
@Override
public void onNewIntent(Intent newIntent) {
    super.onNewIntent(newIntent);
    mResumeNeedsToDoDispatch = true;
}

Обратите внимание, что я не просто вызвал mFragments.dispatchResume () в onNewIntent, потому что в этом случае дважды вызывается метод onResume фрагмента. Я не уверен на 100%, почему это так, но именно это я заметил в своих тестах.

Надеюсь, это поможет:)

0 голосов
/ 10 мая 2012

Я просто хочу добавить к комментарию Джеффа, в моем конкретном случае я воссоздал набор вложенных фрагментов, когда был запущен onNewIntent, и для его успешной работы я установил член класса mShouldUpdateFragments, установив его значение true в onNewIntent, ипереопределение onPostResume, где я выполнял свою работу на основе логического значения.

0 голосов
/ 06 декабря 2011

Это привело меня к связанному открытию -

У меня есть фрагмент, накачанный из тега xml.На Xoom под управлением 3.2.1 все работает как положено.На Galaxy 10.1 под управлением 3.1 метод onResume фрагмента никогда не вызывается .Похоже, исправление было добавлено в 3.2.

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