Разница между add() и replace() с жизненным циклом фрагментации
Моя программа имеет 6 фрагментов: Fragment1, Fragment2,....- > Fragment6.
Я использую оператор add() и replace() для переключения между фрагментом и отслеживания их жизненного цикла.
Fragment1 добавить Fragment2 добавить Fragment3 добавить Fragment4 добавить Fragment5 заменить Fragment6
Лог-кота, чтобы показать свой жизненный цикл (у меня есть некоторые 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
Fragment5 _______ заменить Fragment6
Фрагмент1 _______ onDestroyView
Фрагмент3 _______ onDestroyView
Fragment5 _______ onDestroyView
Fragment6_ _______ _onCreate
Fragment6_ _______ _onCreateView
Мои вопросы:
Почему после того, как Fragment5 заменен на Fragment6, Fragment1 и 3 & 5 уничтожили их представление?.
Что происходит с Fragment2 и 4?
Почему Фрагмент2 и 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();
}
Ответы
Ответ 1
Если вы используете FragmentTransaction
, чтобы скрыть фрагмент, он все равно может находиться в рабочем состоянии своего жизненного цикла, но его пользовательский интерфейс был отсоединен от окна, чтобы он больше не отображался. Таким образом, вы можете технически по-прежнему взаимодействовать с фрагментом и снова подключать его интерфейс, который вам понадобится. Если вы замените фрагмент, вы фактически вытаскиваете его из контейнера, и он будет проходить через все события разрыва в жизненном цикле (onPause
, onStop
и т.д.), И если по какой-то причине вам понадобится этот фрагмент снова вам придется вставить его обратно в контейнер и позволить ему снова запустить всю свою инициализацию.
Ответ 2
При замене вы заменяете все фрагменты (1,2,3,4,5) в ViewGroup
R.id.container
для нового Fragment
(6). Как только фрагменты будут удалены, они будут уничтожены. Когда они будут уничтожены, они вызовут метод onDestroyView()
.
FragmentTransaction заменить
Что касается вашего вопроса на 2 и 4, я не уверен. Можете ли вы опубликовать больше кода, который записывается в logcat?