Разница между 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);