Разница между add (), replace () и addToBackStack()

в чем основное различие между вызовом этих методов:

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);

что означает замена уже существующего фрагмента и добавление фрагмента в состояние действия, а также добавление действия в задний стек?

во-вторых, с findFragmentByTag(), это поиск тег добавил add()/replace() способ или addToBackStack() способ?

5 ответов


1) fragmentTransaction.addToBackStack(str);

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

2) fragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)

описание - заменить существующий фрагмент, который был добавлен в контейнер. Это по существу то же самое, что вызов remove(Fragment) для всех в настоящее время добавлены фрагменты, которые были добавлены с тем же containerViewId, а затем добавить(int, фрагмент, строка) с теми же аргументами, приведенными здесь.

3) fragmentTransaction.add(int containerViewId, Fragment fragment, String tag)

описание - добавить фрагмент в состояние действия. Этот фрагмент может также иметь свой вид (если фрагмент.onCreateView возвращает ненулевое значение) в представление контейнера действия.

что значит заменить уже существующий фрагмент, и добавив фрагмент в состояние activity и добавление activity в конец стек ?

существует стек, в котором хранятся все действия в запущенном состоянии. Фрагменты относятся к деятельности. Таким образом, вы можете добавить их, чтобы внедрить их в действие.

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

когда вы переходите к текущему макету, у вас есть идентификатор этого контейнера, чтобы заменить его фрагментом, который вы хотите.

вы также можете вернуться к предыдущему фрагменту в backStack с помощью popBackStack() метод. Для этого нужно добавить этот фрагмент в стек, используя addToBackStack() а то commit() отразить. Это в обратном порядке с течением сверху.

findFragmentByTag выполняет этот поиск по тегу, добавленному add/replace метод или метод addToBackStack ?

Если зависит от того, как вы добавили тег. Затем он просто находит фрагмент по тегу, который вы определили ранее либо при раздувании из XML, либо при добавлении в транзакцию.

ссылки: FragmentTransaction


еще одна разница в важности между add и replace is: replace удаляет существующий фрагмент и добавляет новый фрагмент. Это означает,что при нажатии кнопки "Назад" замененный фрагмент будет создан с вызываемым onCreateView. Тогда как add сохраняет существующие фрагменты и добавляет новый фрагмент, который означает, что существующий фрагмент будет активен, и они не будут в состоянии "приостановлено", следовательно, когда кнопка Назад нажата onCreateView не вызывается для существующего фрагмент (фрагмент, который был там до добавления нового фрагмента). С точки зрения событий жизненного цикла фрагмента onPause, onResume, onCreateView и другие события жизненного цикла будут вызываться в случае replace но они не будут применяться в случае add.

редактировать: следует быть осторожным, если она использует какую-то библиотеку шины событий, как Eventbus Greenrobot и повторное использование того же фрагмента для стека фрагмента поверх другого через add. В этот сценарий, даже если вы следуете лучшей практике и регистрируете шину событий в onResume и регистрацию в onPause, шина событий по-прежнему будет активна в каждом экземпляре добавленного фрагмента как add фрагмент не вызовет ни один из этих методов жизненного цикла фрагмента. В результате прослушиватель шины событий в каждом активном экземпляре фрагмента будет обрабатывать одно и то же событие, которое может быть не тем, что вы хотите.


пример действия имеет 2 фрагмента, и мы используем FragmentManager заменить/добавить с addToBackstack каждый фрагмент макета в activity

использовать replace

Перейти Fragment1

Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Перейти Fragment2

Fragment1: onStop
Fragment1: onDestroyView
Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume

Поп Fragment2

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Поп Fragment1

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy

использовать добавить

Перейти Fragment1

Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Перейти Fragment2

Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume

Поп Fragment2

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy

Поп Fragment1

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy

пример проекта


основная разница между add() и replace() можно охарактеризовать как:

  • add() используется для простого добавления фрагмента к некоторому корневому элементу.
  • replace() ведет себя аналогично, но сначала удаляет предыдущие фрагменты, а затем добавляет следующий фрагмент.

мы можем видеть точную разницу, когда мы используем addToBackStack() вместе с add() или replace().

когда мы нажимаем кнопку назад, после того, как в случае add()... onCreateView это никогда не звонил, но в случае replace(), когда мы нажимаем кнопку Назад ... oncreateView вызывается каждый раз.


add () ...это используется для добавления фрагмента в framelayout и использовать в этом недостатке предыдущий фрагмент может показать в фоновом режиме

transaction.add(R.id.framelayout, fragment);

заменить()...это используется для замены фрагмента на framelayout и использовать для этого преимущество предыдущий фрагмент не может отображаться в фоновом режиме, но хранить все фрагменты

transaction.replace(R.id.framelayout, fragment);

addToBackStack () ... используется для хранения всех фрагментов в фоновом режиме и, когда пользователь может нажать кнопку Назад затем перейдите к предыдущему фрагменту

transaction.addToBackStack(null);