1) fragmentTransaction.addToBackStack(str);
Описание - Добавить эту транзакцию в задний стек. Это означает, что транзакция будет запомнена после ее фиксации, и будет отменять свою работу, когда позднее будет извлечена из стека.
2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
Описание - заменить существующий фрагмент, который был добавлен в контейнер. По сути, это то же самое, что вызов метода remove (Fragment) для всех добавленных в данный момент фрагментов, которые были добавлены с тем же containerViewId, а затем добавлены (int, Fragment, String) с теми же аргументами, что и здесь.
3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
Описание - добавить фрагмент в состояние активности. Этот фрагмент может также иметь свое представление (если Fragment.onCreateView возвращает ненулевое значение) в контейнерное представление действия.
Что значит заменить уже существующий фрагмент, добавить фрагмент в состояние активности и добавить действие в задний стек?
Существует стек, в котором хранятся все действия в рабочем состоянии. Фрагменты относятся к деятельности. Таким образом, вы можете добавить их, чтобы включить их в упражнение.
Вы можете объединить несколько фрагментов в одном действии, чтобы создать многопанельный пользовательский интерфейс и повторно использовать фрагмент в нескольких действиях. Это особенно полезно, когда вы определили свой контейнер фрагментов в разных макетах. Вам просто нужно заменить любой другой фрагмент в любом макете.
Когда вы переходите к текущему макету, у вас есть идентификатор этого контейнера, чтобы заменить его нужным фрагментом.
Вы также можете вернуться к предыдущему фрагменту в backStack с помощью popBackStack()
метода. Для этого вам нужно добавить этот фрагмент в стек, используя addToBackStack()
и затем commit()
отражать. Это в обратном порядке с током сверху.
findFragmentByTag выполняет ли этот поиск тег, добавленный методом добавления / замены или методом addToBackStack?
Если зависит от того, как вы добавили тег. Затем он просто находит фрагмент по тегу, который вы определили ранее, либо при накачке из XML, либо при добавлении при добавлении в транзакцию.
Ссылки: FragmentTransaction
Еще одно важное различие между
add
иreplace
это:replace
удаляет существующий фрагмент и добавляет новый фрагмент. Это означает, что при нажатии кнопки «Назад» будет создан фрагмент, который был замененonCreateView
. Принимая во внимание,add
что существующие фрагменты сохраняются и добавляется новый фрагмент, что означает, что существующий фрагмент будет активным, и они не будут находиться в состоянии «приостановлено», поэтому при нажатии кнопки «Назад»onCreateView
не вызывается для существующего фрагмента (фрагмент, который был там до того, как новый фрагмент был добавлено).С точки зрения событий жизненного цикла фрагмента
onPause
,onResume
,onCreateView
и другие события жизненного цикла будет вызываться в случае ,replace
но они не будут вызываться в случаеadd
.Редактировать : нужно быть осторожным, если она использует какую-то библиотеку шины событий, такую как Eventrobot Greenrobot, и повторно использует тот же фрагмент, чтобы поместить фрагмент поверх другого через
add
. В этом сценарии, даже если вы будете следовать рекомендациям и зарегистрировать шину событийonResume
и отменить ее регистрациюonPause
, шина событий будет по-прежнему активна в каждом экземпляре добавленного фрагмента, посколькуadd
фрагмент не будет вызывать ни один из этих методов жизненного цикла фрагмента. В результате прослушиватель шины событий в каждом активном экземпляре фрагмента будет обрабатывать одно и то же событие, которое может не соответствовать вашему желанию.источник
Пример действия имеет 2 фрагмента, и мы используем
FragmentManager
для замены / добавленияaddToBackstack
каждого фрагмента в макет в действииИспользуйте заменить
Go Fragment1
Go Fragment2
Pop Fragment2
Pop Fragment1
Используйте добавить
Go Fragment1
Go Fragment2
Pop Fragment2
Pop Fragment1
Пример проекта
источник
onPause()
должен был быть вызван раньшеonStop()
на каждом поп- акции?Хотя на этот старый вопрос уже дан ответ, возможно, эти следующие примеры могут дополнить принятый ответ, и они могут быть полезны для некоторых новых программистов в Android, как и я.
Вариант 1 - «addToBackStack ()» никогда не используется
Случай 1А - добавление, удаление и нажатие кнопки «Назад»
Случай 1B - добавление, замена и нажатие кнопки «Назад»
Вариант 2 - «addToBackStack ()» всегда используется
Случай 2А - добавление, удаление и нажатие кнопки «Назад»
Случай 2B - добавление, замена, удаление и нажатие кнопки «Назад»
Вариант 3 - «addToBackStack ()» используется не всегда (в приведенных ниже примерах без указания указывает, что он не используется)
Случай 3А - добавление, удаление и нажатие кнопки «Назад»
Случай 3B - добавление, замена, удаление и нажатие кнопки «Назад»
источник
Основное различие между
add()
иreplace()
может быть описано как:add()
используется для простого добавления фрагмента в некоторый корневой элемент.replace()
ведет себя аналогично, но сначала удаляет предыдущие фрагменты, а затем добавляет следующий фрагмент.Мы можем увидеть точную разницу, когда мы используем
addToBackStack()
вместе сadd()
илиreplace()
.Когда мы нажимаем кнопку «назад» после, в случае
add()
... onCreateView никогда не вызывается, но в случаеreplace()
, когда мы нажимаем кнопку «назад», oncreateView вызывается каждый раз.источник
Когда мы добавляем первый фрагмент -> второй фрагмент, используя метод add ()
Когда мы используем add () во фрагменте
Когда мы используем replace () во фрагменте
переход от первого фрагмента ко второму фрагменту в First -> Second с использованием метода replace ()
В случае замены первого фрагмента этот метод вызывается дополнительно (onPause, onStop, onDestroyView вызывается дополнительно)
E / Keshav Первый фрагмент: onPause
E / Keshav FirstFragment: onStop
E / Keshav Первый фрагмент: onDestroyView
источник
Функция добавления и замены FragmentManger может быть описана как эти 1. add означает, что она добавит фрагмент в задний стек фрагмента и покажет в заданном кадре, который вы предоставляете, как
getFragmentManager.beginTransaction.add(R.id.contentframe,Fragment1.newInstance(),null)
2.relace означает, что вы заменяете фрагмент другим фрагментом в данном кадре.
getFragmentManager.beginTransaction.replace(R.id.contentframe,Fragment1.newInstance(),null)
Основная утилита между ними заключается в том, что когда вы вернетесь в стек, замена обновит фрагмент, но добавление не обновит предыдущий фрагмент.
источник
Важно отметить, что:
Разница между Replace и Replace with backstack заключается в том, что всякий раз, когда мы используем только replace, фрагмент уничтожается (вызывается ondestroy ()), а когда мы используем замену backstack, фрагменты onDestroy () не вызываются (т. Е. При нажатии кнопки back фрагмент вызывается с его onCreateView ())
источник
Вот картина, которая показывает разницу между
add()
иreplace()
Таким образом,
add()
метод продолжает добавлять фрагменты поверх предыдущего фрагмента в FragmentContainer.Хотя
replace()
методы удаляют весь предыдущий фрагмент из контейнеров, а затем добавляют его в FragmentContainer.Что такое addToBackStack
addtoBackStack
Метод можно использовать с методами add () и replace. Это служит другой цели в API Фрагмента.Какова цель?
API фрагментов, в отличие от API действий, по умолчанию не включает навигацию по кнопке «Назад ». Если вы хотите вернуться к предыдущему фрагменту, тогда мы используем метод addToBackStack () во фрагменте. Давайте разберемся как
Случай 1:
Случай 2:
источник