Какая разница между отрывом фрагмента и его удалением? - PullRequest
109 голосов
/ 06 февраля 2012

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

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

Ответы [ 2 ]

148 голосов
/ 06 февраля 2012

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

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

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

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

52 голосов
/ 11 марта 2014

Названия методов управления фрагментами очень запутаны, даже по мнению инженеров 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

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

Это удаляет любую связь с View или с Activity.

Вот результирующие события жизненного цикла и возвращаемые значения других важных методов:

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

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

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

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

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

Вот результирующие события жизненного цикла и другие важные значения, возвращаемые методом:

onPause()                             
onStop()                              
onDestroyView()                      

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

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

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

Вот результирующие события жизненного цикла и другие важные значения, возвращаемые методом:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...