Какая разница между отсоединением фрагмента и его удалением?

В документах Android для FragmentTransaction я заметил два очень похожих метода: detach и remove. Описания там, кажется, не дают большого понимания того, когда использовать их, и из того, что я могу сказать, они кажутся одинаковыми.

Итак: каковы различия между этими двумя методами?

Ответ 1

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

Удалить означает, что экземпляр фрагмента не может быть повторно присоединен. Вам придется добавить его снова к транзакции фрагмента.

Комментарий к источнику

Вы заметите, что когда фрагмент отсоединяется, его вызовы onPause, onStop и onDestroyView вызывают только (в этом порядке). С другой стороны, когда фрагмент удаляется, его вызовы onPause, onStop, onDestroyView, onDestroy и onDetach вызываются (в этом порядке). Аналогично, при подключении вызываются только методы фрагмента onCreateView, onStart и onResume; и при добавлении вызывается метод фрагмента onAttach, onCreate, onCreateView, onStart и onResume (в этом порядке). - Адиль Хусейн

Ответ 2

Именование методов управления фрагментами очень запутанно даже в соответствии с инженерами Google на досках объявлений (см. комментарии выше). Я сделал себе небольшую демоверсию, чтобы понять, как все работает. Вот мои выводы. Не стесняйтесь исправить меня, если я ошибаюсь.

Чтобы изначально добавить фрагмент в действие, вы используете: getFragmentManager(). beginTransaction(). add (R.id.container, mFragment).commit().

Это связывает действие с фрагментом, а также связывает представление с фрагментом.

Ниже приведены результаты жизненного цикла и другие важные возвращаемые значения метода:

onAttach()           
onCreate()           
onCreateView()       
onViewCreated()      
onActivityCreated()  
onViewStateRestored()
onStart()            
onResume()

mFragment.getView() == null: false                    
mFragment.getActivity() == null: false

Чтобы удалить фрагмент из Activity, вы используете: getFragmentManager(). BeginTransaction(). удалить (mFragment).commit().

Это удаляет любую связь с представлением или действием.

Ниже приведены результаты жизненного цикла и другие важные возвращаемые значения метода:

onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()

mFragment.getView() == null: true
mFragment.getActivity() == null: true

Я снова добавил фрагмент здесь

Чтобы отсоединить добавленный фрагмент от Activity, вы используете: getFragmentManager(). BeginTransaction(). отсоединить (mFragment).commit().

Это удаляет любую связь с представлением, но сохраняет связь с Activity.

Ниже приведены результаты жизненного цикла и другие важные возвращаемые значения метода:

onPause()                             
onStop()                              
onDestroyView()                      

mFragment.getView() == null: true
mFragment.getActivity() == null: false

Чтобы повторно присоединить фрагмент, который был отсоединен к Activity, вы используете: getFragmentManager(). BeginTransaction(). присоединять (mFragment).commit().

Это создает новый вид для связи с фрагментом и поддерживает ассоциацию Activity.

Ниже приведены результаты жизненного цикла и другие важные возвращаемые значения метода:

onCreateView()                        
onViewCreated()                       
onActivityCreated()                   
onViewStateRestored()                 
onStart()                             
onResume()                            

mFragment.getView() == null: false
mFragment.getActivity() == null: false

Другие важные моменты: Если вы отсоедините фрагмент, а затем попытайтесь добавить его снова, используя add(), а не attach(), ничего не изменится.

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

Когда getView() возвращает значение null, фрагмент может по-прежнему иметь внутренние ссылки на последний созданный View. Этот вид больше не действителен и не должен использоваться.