Разница между 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) в ViewGroup
R.id.container
для вашего нового Fragment
(6). Как только фрагменты будут удалены, они будут уничтожены. После уничтожения они назовут onDestroyView()
метод.
Что касается вашего вопроса для 2 и 4, я не уверен. Вы можете разместить больше кода, который пишет в logcat?