Подтвердить что ты не робот

Разница между фрагментомTransaction.add и фрагментомTransaction.replace

То, что я уже знаю:

после fragmentTransaction.replace(), будет вызываться функция текущего фрагмента onStop() а fragmentTransaction.add() не будет.

и после вызова fragMgr.popBackStack(); мы вернемся к предыдущему фрагменту, независимо от того, используется ли fragmentTransaction.replace или fragmentTransaction.add()

Итак, что делает fragmentTransaction.replace?

Я могу понять, что мы можем добавить фрагмент к предыдущему фрагменту и позже вернуться к предыдущему фрагменту popBackStack(), НО:

если предыдущий фрагмент "заменен" текущим фрагментом, я предполагаю, что предыдущий фрагмент удален и добавлен текущий фрагмент, как он может вернуться к предыдущему фрагменту при вызове popBackStack()?

4b9b3361

Ответ 1

Вы можете добавить несколько фрагментов в контейнер, и они будут накладываться друг на друга. Если ваши фрагменты имеют прозрачный фон, вы увидите этот эффект и сможете одновременно взаимодействовать с несколькими фрагментами.

Это то, что произойдет, если вы используете FragmentTransaction.add в контейнере. Ваш добавленный фрагмент будет помещен поверх вашего существующего фрагмента.

Если вы используете FragmentTransaction.replace(R.id.container,fragment), он удалит все фрагменты, которые уже находятся в контейнере, и добавьте новый в тот же контейнер.

Вы также можете использовать метод add без идентификатора контейнера, и ваш фрагмент будет просто добавлен в список фрагментов в FragmentManager, и вы можете в любой момент вспомнить их значение тега.

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

Ответ 2

Два варианта

Допустим, у вас есть контейнер с фрагментами.
И ваша задача - добавить фрагмент в контейнер.

Вы можете сделать это, вызвав любой из следующих методов

1) add(containerId,fragment)
2) replace(containerId,fragment)

Но оба метода отличаются по поведению !!!

enter image description here Хотя оба метода добавят ваш фрагмент в контейнер фрагментов, их внутренности (внутренняя работа) различаются в зависимости от двух возможных состояний контейнера фрагментов.
Когда фрагмент контейнера
1) не содержит фрагментов.
2) к нему уже прикреплен один или несколько фрагментов.

Давайте посмотрим, что происходит, когда мы вызываем методы add() и replace().

Случай 1: когда в контейнере нет фрагмента

В этом случае оба метода добавят фрагмент в контейнер. Таким образом, они будут производить тот же эффект.

Случай 2: когда fragContainer уже имеет фрагмент/фрагменты

add(): добавляет новый фрагмент сверху другого фрагмента
replace(): удаляет все, затем добавляет новый фрагмент

пример
Предположим, что у контейнера Fragment есть fragments[A->B->C].
Теперь вы хотите добавить новый fragment D
Результатом метода add() будет [A->B->C->D]
результат метода replace() будет [D]

Соответствующая ссылка:

Проверьте этот демонстрационный проект для лучшего понимания.