Разница между фрагментомTransaction.add и фрагментомTransaction.replace
То, что я уже знаю:
после fragmentTransaction.replace()
, будет вызываться функция текущего фрагмента onStop()
а fragmentTransaction.add()
не будет.
и после вызова fragMgr.popBackStack();
мы вернемся к предыдущему фрагменту, независимо от того, используется ли fragmentTransaction.replace
или fragmentTransaction.add()
Итак, что делает fragmentTransaction.replace
?
Я могу понять, что мы можем добавить фрагмент к предыдущему фрагменту и позже вернуться к предыдущему фрагменту popBackStack()
, НО:
если предыдущий фрагмент "заменен" текущим фрагментом, я предполагаю, что предыдущий фрагмент удален и добавлен текущий фрагмент, как он может вернуться к предыдущему фрагменту при вызове popBackStack()
?
Ответы
Ответ 1
Вы можете добавить несколько фрагментов в контейнер, и они будут накладываться друг на друга. Если ваши фрагменты имеют прозрачный фон, вы увидите этот эффект и сможете одновременно взаимодействовать с несколькими фрагментами.
Это то, что произойдет, если вы используете FragmentTransaction.add в контейнере. Ваш добавленный фрагмент будет помещен поверх вашего существующего фрагмента.
Если вы используете FragmentTransaction.replace(R.id.container,fragment)
, он удалит все фрагменты, которые уже находятся в контейнере, и добавьте новый в тот же контейнер.
Вы также можете использовать метод add без идентификатора контейнера, и ваш фрагмент будет просто добавлен в список фрагментов в FragmentManager, и вы можете в любой момент вспомнить их значение тега.
Вы можете вернуться к предыдущей конфигурации, если вы добавили транзакцию в задний стек. Вы можете сделать это, даже если предыдущая операция удалила фрагмент. Удаленный фрагмент запоминается в транзакции и возвращает его обратно.
Ответ 2
Два варианта
Допустим, у вас есть контейнер с фрагментами.
И ваша задача - добавить фрагмент в контейнер.
Вы можете сделать это, вызвав любой из следующих методов
1) add(containerId,fragment)
2) replace(containerId,fragment)
Но оба метода отличаются по поведению !!!
Хотя оба метода добавят ваш фрагмент в контейнер фрагментов, их внутренности (внутренняя работа) различаются в зависимости от двух возможных состояний контейнера фрагментов.
Когда фрагмент контейнера
1) не содержит фрагментов.
2) к нему уже прикреплен один или несколько фрагментов.
Давайте посмотрим, что происходит, когда мы вызываем методы add()
и replace()
.
Случай 1: когда в контейнере нет фрагмента
В этом случае оба метода добавят фрагмент в контейнер. Таким образом, они будут производить тот же эффект.
Случай 2: когда fragContainer уже имеет фрагмент/фрагменты
add()
: добавляет новый фрагмент сверху другого фрагмента
replace()
: удаляет все, затем добавляет новый фрагмент
пример
Предположим, что у контейнера Fragment есть fragments[A->B->C]
.
Теперь вы хотите добавить новый fragment D
Результатом метода add()
будет [A->B->C->D]
результат метода replace()
будет [D]
Соответствующая ссылка:
Проверьте этот демонстрационный проект для лучшего понимания.