Разница между add() и replace() с жизненным циклом фрагмента

В моей программе 6 фрагментов: Fragment1, Fragment2,....->Fragment6.

Я использую операторы add() и replace() для переключения между фрагментами и отслеживания их жизненного цикла.

Фрагмент1 добавить Фрагмент2 добавить Фрагмент3 добавить Фрагмент4 добавить Фрагмент5 заменить Фрагмент6

Log-cat, чтобы показать их жизненный цикл (у меня есть несколько точек printf в onCreate, onCreateView, onDestroyView, onDestroy для отслеживания)


Тег __ _ __ _ __ _ __ _ __ Текст

Fragment1_ _ __ _ ___ _onCreate

Fragment1_ _ __ _ ___ _onCreateView

Fragment1_ _ __ _ ___ _add Fragment2

Fragment2_ _ __ _ ___ _onCreate

Fragment2_ _ __ _ ___ _onCreateView

Fragment2_ _ __ _ ___ _add Fragment3

Fragment3_ _ __ _ ___ _onCreate

Fragment3_ _ __ _ ___ _onCreateView

Fragment3_ _ __ _ ___ _add Fragment4

Fragment4_ _ __ _ ___ _onCreate

Fragment4_ _ __ _ ___ _onCreateView

Fragment4_ _ __ _ ___ _add Fragment5

Fragment5_ _ __ _ ___ _onCreate

Fragment5_ _ __ _ ___ _onCreateView

Фрагмент5 __ _ __ _ _ заменить Фрагмент6

Фрагмент1 __ _ __ _ _ onDestroyView

Фрагмент3 __ _ __ _ _ onDestroyView

Фрагмент5 __ _ __ _ _ onDestroyView

Fragment6_ _ __ _ ___ _onCreate

Fragment6_ _ __ _ ___ _onCreateView


Мои вопросы:

Почему после того, как Fragment5 заменен Fragment6, Fragment1 & 3 &5 уничтожат их вид?

Что происходит с Fragment2 & 4?

Почему Fragment2 & 4 не разрушен, их вид как Fragment1 & 3 &5?

Пожалуйста, помогите мне полностью понять жизненный цикл фрагмента при вызове методов add() и replace().


Обновите мой метод addFragment и replaceFragment:

public void addFragment(Fragment fromFragment, Fragment toFragment) {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.container,toFragment, toFragment.getClass().getName());
    transaction.hide(fromFragment);
    transaction.addToBackStack(toFragment.getClass().getName());
    transaction.commit();
}

public void replaceFragment(Fragment fromFragment, Fragment toFragment) {
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.container,toFragment, toFragment.getClass().getName());
    transaction.hide(fromFragment);
    transaction.addToBackStack(toFragment.getClass().getName());
    transaction.commit();
}

2 ответа

Если вы используете FragmentTransaction чтобы скрыть фрагмент, он все еще может находиться в рабочем состоянии своего жизненного цикла, но его пользовательский интерфейс был отсоединен от окна, поэтому он больше не виден. Таким образом, вы можете технически по-прежнему взаимодействовать с фрагментом и подключать его интерфейс позже, когда вам это нужно. Если вы замените фрагмент, то вы фактически вытаскиваете его из контейнера, и он будет проходить через все события разрыва в жизненном цикле (onPause, onStopи т. д.) и если по какой-то причине вам снова понадобится этот фрагмент, вам придется вставить его обратно в контейнер и снова запустить через всю его инициализацию.

При замене вы заменяете все фрагменты (1,2,3,4,5) в ViewGroupR.id.container для вашего нового Fragment (6). Как только фрагменты будут удалены, они будут уничтожены. После уничтожения они назовут onDestroyView() метод.

FragmentTransaction заменить

Что касается вашего вопроса для 2 и 4, я не уверен. Вы можете разместить больше кода, который пишет в logcat?

Другие вопросы по тегам