Разница между add (), replace () и addToBackStack()
в чем основное различие между вызовом этих методов:
fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);
Что значит заменить уже существующий фрагмент и добавить фрагмент в состояние activity, а также добавить activity в задний стек?
во-вторых, с 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 возвращает ненулевое значение) в представление контейнера действия.
что значит заменить уже существующий фрагмент, и добавив фрагмент в состояние действия и добавление действия в спину стек ?
существует стек, в котором хранятся все действия в запущенном состоянии. Фрагменты относятся к деятельности. Таким образом, вы можете добавить их, чтобы внедрить их в действие.
вы можете объединить несколько фрагментов в одном действии, чтобы построить многопанельный пользовательский интерфейс и повторно использовать фрагмент в нескольких действиях. Это существенно полезно, когда вы определили свой контейнер фрагментов в разных макеты. Вам просто нужно заменить любой другой фрагмент в любом макете.
когда вы переходите к текущему макету, у вас есть идентификатор этого контейнера, чтобы заменить его фрагментом, который вы хотите.
вы также можете вернуться к предыдущему фрагменту в backStack с помощью
popBackStack()метод. Для этого вам нужно добавить этот фрагмент в стек с помощьюaddToBackStack()а тоcommit()отразить. Это в обратном порядке с текущим сверху.findFragmentByTag выполняет этот поиск тега, добавленного добавлением / заменой метод или метод addToBackStack ?
Если зависит от того, как вы добавили тег. Затем он просто находит фрагмент по его тегу, который вы определили раньше либо при раздувании из XML, либо при добавлении в транзакцию.
ссылки: FragmentTransaction
еще одно важное различие между
addиreplaceis:replaceудаляет существующий фрагмент и добавляет новый фрагмент. Это означает, что при нажатии кнопки Назад фрагмент, который был заменен будет создан с его onCreateView вызывается. Тогда какaddсохраняет существующие фрагменты и добавляет новый фрагмент, который означает, что существующий фрагмент будет активен, и они не будут находиться в состоянии "приостановлено", следовательно, когда кнопка Назад нажата onCreateView не вызывается для существующего фрагмент (фрагмент, который был там до добавления нового фрагмента). С точки зрения событий жизненного цикла фрагмента onPause, onResume, onCreateView и другие события жизненного цикла будут вызваны в случаеreplaceно они не будут применяться в случаеadd.Edit: следует быть осторожным, если она использует какой-то библиотеки шины событий, как Eventbus Greenrobot и повторное использование одного и того же фрагмента для стека фрагмента поверх других через
add. В этот сценарий, даже если вы следуете рекомендациям и регистрируете шину событий вonResumeи регистрацию вonPause, шина событий будет по-прежнему активна в каждом экземпляре добавленного фрагмента какaddфрагмент не будет вызывать ни один из этих методов жизненного цикла фрагмента. В результате прослушиватель шины событий в каждом активном экземпляре фрагмента будет обрабатывать одно и то же событие, которое может быть не тем, что вы хотите.
пример деятельности есть 2 фрагмента, и мы используем
FragmentManagerзаменить/добавить сaddToBackstackкаждый фрагмент макета в activityзаменить
Go Fragment1
Fragment1: onCreateView Fragment1: onStart Fragment1: onResumeGo Fragment2
Fragment1: onStop Fragment1: onDestroyView Fragment2: onCreateView Fragment2: onStart Fragment2: onResumePop Fragment2
Fragment2: onStop Fragment2: onDestroyView Fragment2: onDestroy Fragment1: onCreateView Fragment1: onStart Fragment1: onResumePop Fragment1
Fragment1: onStop Fragment1: onDestroyView Fragment1: onDestroyиспользовать добавить
Go Fragment1
Fragment1: onCreateView Fragment1: onStart Fragment1: onResumeGo Fragment2
Fragment2: onCreateView Fragment2: onStart Fragment2: onResumePop Fragment2
Fragment2: onStop Fragment2: onDestroyView Fragment2: onDestroyPop Fragment1
Fragment1: onStop Fragment1: onDestroyView Fragment1: onDestroy
основная разница между
add()иreplace()можно охарактеризовать как:
add()используется для простого добавления фрагмента к некоторому корневому элементу.replace()ведет себя аналогично, но сначала он удаляет предыдущие фрагменты, а затем добавляет следующий фрагмент.мы можем видеть точную разницу, когда мы используем
addToBackStack()вместе сadd()илиreplace().когда мы нажимаем кнопку назад, после того, как в случае
add()... onCreateView это никогда не звонил, но в случаеreplace(), когда мы нажимаем кнопку Назад ... oncreateView вызывается каждый раз.
добавить() ...это используется для добавления фрагмента в framelayout и использовать к этому недостатку предыдущий фрагмент может показать в фоновом режиме
transaction.add(R.id.framelayout, fragment);заменить()...это используется для замены фрагмента на framelayout и использовать это преимущество предыдущий фрагмент не может показать в фоновом режиме, но хранить все фрагменты
transaction.replace(R.id.framelayout, fragment);addToBackStack () ... используется для хранения всех фрагментов в фоновом режиме и, когда пользователь может нажать кнопку Назад затем перейдите к предыдущему фрагменту
transaction.addToBackStack(null);
Comments