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



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



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


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



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

807   5  

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 и replace is: 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: onResume

Go Fragment2

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

Pop Fragment2

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

Pop Fragment1

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy

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

Go Fragment1

Fragment1: onCreateView
Fragment1: onStart
Fragment1: onResume

Go Fragment2

Fragment2: onCreateView
Fragment2: onStart
Fragment2: onResume

Pop Fragment2

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy

Pop 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

    Ничего не найдено.