it-swarm.com.ru

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

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

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

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

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

254
AndroidDev

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

290
My God

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

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

291
Jeevan

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

Используйте замену

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

Используйте add

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

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

52
Linh

Основное различие между add() и replace() можно описать так:

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

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

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

15
Avanindra_dubey

Хотя это старый вопрос, на который уже дан ответ, возможно, эти следующие примеры могут дополнить принятый ответ, и они могут быть полезны для некоторых новых программистов в Android, как и я.

Вариант 1 - «addToBackStack ()» никогда не используется

Случай 1А - добавление, удаление и нажатие кнопки «Назад»

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

Случай 1B - добавление, замена и нажатие кнопки «Назад»

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               App is closed, nothing is visible

Вариант 2 - всегда используется «addToBackStack ()»

Случай 2А - добавление, удаление и нажатие кнопки «Назад»

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Fragment B is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Случай 2B - добавление, замена, удаление и нажатие кнопки «Назад»

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView()  
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()   
Fragment B :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Вариант 3 - «addToBackStack ()» используется не всегда (в приведенных ниже примерах без указания указывает, что он не используется)

Случай 3А - добавление, удаление и нажатие кнопки «Назад»

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
add Fragment C w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Fragment B is visible
(Back button clicked)
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible

Случай 3B - добавление, замена, удаление и нажатие кнопки «Назад»

Activity :      onCreate() - onStart() - onResume()                             Activity is visible
add Fragment A :    onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment A is visible
add Fragment B w/o:     onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment B is visible
(replace Fragment C)    
Fragment B :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()   
Fragment A :        onPause() - onStop() - onDestroyView() 
Fragment C :        onAttach() - onCreate() - onCreateView() - onActivityCreated() - onStart() - onResume()     Fragment C is visible
remove Fragment C :     onPause() - onStop() - onDestroyView()                              Activity is visible
(Back button clicked)
Fragment C :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment C is visible
(Back button clicked)
Fragment C :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               
Fragment A :        onCreateView() - onActivityCreated() - onStart() - onResume()                   Fragment A is visible
(Back button clicked)
Fragment A :        onPause() - onStop() - onDestroyView() - onDestroy() - onDetach()               Activity is visible
(Back button clicked)
Activity :      onPause() - onStop() - onDestroy()                              App is closed, nothing is visible
2
Javi

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

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

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

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

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

transaction.addToBackStack(null);
0
MD Khali