Методы фрагмента: attach(), detach(), remove(), replace(), popBackStack()

Я очень запутался между этими функциями и их целями. Я заметил, что использование replace() заменяет существующий фрагмент новым. Мы можем использовать addToBackStack(null), чтобы поместить этот фрагмент в задний стек, чтобы мы могли вернуться к ранее показанному фрагменту. Теперь при добавлении (или замене) фрагмента - onAttach() -> onCreate() и т.д.... методы фрагмента вызываются по порядку.

Теперь, когда мы вызываем remove() для фрагмента из нашей активности, какие функции фрагмента вызываются и в каком порядке?

Что делают attach() и detach()? Удаляет ли detach() фрагмент? А при использовании этих двух attach() и detach() какие функции фрагмента вызываются и в каком порядке??

Кроме того, что происходит popBackStack()?? Я имею в виду, какие функции вызываются, когда мы используем popBackStack()на фрагменте из нашей активности??

И когда вызывается onDestroy()??

Спасибо.


person Vikram Gupta    schedule 28.08.2012    source источник


Ответы (3)


Теперь, когда мы вызываем remove() для фрагмента из нашей активности, какие функции фрагмента вызываются и в каком порядке?

Посмотрите на http://developer.android.com/reference/android/app/Fragment.html .

Порядок такой: onPause(), onStop(), onDestroyView(), onDestroy(), onDetach()

Что делают attach() и detach()? Удаляет ли detach() фрагмент? И когда используются эти две функции attach() и detach(), какие функции фрагмента вызываются и в каком порядке??

attach() и detach() соответственно связывают или отсоединяют Fragment от Activity. При присоединении Fragment вызывается метод жизненного цикла onAttach(), при отсоединении вызывается метод жизненного цикла onDetach() в Fragment. Для получения дополнительной информации смотрите ссылку выше.

Кроме того, что происходит с popBackStack()?? Я имею в виду, какие функции вызываются, когда мы используем popBackStack() для фрагмента из нашей активности??

Если Fragment не был уничтожен, то на popBackStack() вызываются методы onStart() и onResume(). Если Fragment был ранее уничтожен, то методы жизненного цикла будут вызываться, начиная с onAttach(). Это то же самое, что и при нажатии кнопки «Назад» на Activities.

person Adam Monos    schedule 28.08.2012
comment
в popBackStack() вызываются методы onStart() и onResume(). Как это возможно??? мы извлекаем фрагмент, а не добавляем его. - person Vikram Gupta; 28.08.2012
comment
Когда вы выталкиваете задний стек, это означает, что вы удаляете свой текущий фрагмент и заменяете его предыдущим, где предыдущий фрагмент хранится в заднем стеке. - person Adam Monos; 28.08.2012
comment
Вы выталкиваете фрагмент из заднего стека, а не с экрана. Это аналог addToBackStack(). - person Adam Monos; 28.08.2012
comment
@vickey в popBackStack() методы onStart() и onResume() не вызываются. Я ищу решение для этого, так как мне нужно позвонить в веб-сервис. Какие-либо предложения? - person Rishabh Srivastava; 14.11.2013
comment
@RishabhSrivastava это зависит от всплывающих переходов, если использовалось скрытие/показ, вы не получите никакого onStart/onResume, однако, если последняя транзакция была заменой - она ​​сработает, поскольку фрагмент создается из onAttach - person J.G.Sebring; 02.09.2015
comment
@Tapirboy на самом деле прошло 2 года, так что я уже нашел способ :D - person Rishabh Srivastava; 03.09.2015
comment
@RishabhSrivastava, если использовалось скрытие/показ, то onHiddenChanged() вызывается, когда popBackStack() - person Jorge E. Hernández; 26.11.2015
comment
Ответ по поводу attach() и detach() неверный. Вызов detach() сохраняет фрагмент, прикрепленный к активности, поэтому onDetach() не вызывается, но он отсоединяет свою иерархию представлений, поэтому onPause(), onStop() и onDestroyView() вызываются по порядку. Вызов attach() требует, чтобы фрагмент находился в состоянии отдельного просмотра, и вернет его в нормальное состояние, вызывая по порядку: onCreateView(), onActivityCreated(), onStart() и onResume(). - person BladeCoder; 16.08.2016

Просто заметка о popBackStack(). Он не извлекает фрагмент, он извлекает транзакцию фрагмента. Таким образом, какая бы ни была последняя транзакция фрагмента, она отменяется. Если бы вы отображали FragmentA и ваша транзакция была:

fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);

Он заменит FragmentA на FragmentB и добавит эту транзакцию (не фрагмент) в задний стек. Если вы затем нажмете кнопку «Назад», он вытолкнет задний стек и получит транзакцию, которая была «заменить этот FragmentA на FragmentB». Затем он отменяет эту транзакцию. В обратном направлении инструкция состоит в том, чтобы заменить любой текущий фрагмент на FragmentA. Если исходный FragmentA все еще существует, он использует его. Если он был разрушен, он создает новый.

person emote_control    schedule 10.02.2014

Предположим, что фрагмент A и фрагмент B были добавлены в контейнер со следующими шагами:

1. Added fragment A =>  .replace(R.id.container, fragmentA) => addToBackStack(null)
2. Added fragment B =>  .replace(R.id.container, fragmentB) => addToBackStack(null)
3. Removed fragment B => fragmentManager.popBackStack();

Обратные вызовы при вызове fm.popBackStack():

FragmentB: onPause()
FragmentB: onStop()
FragmentB: onDestroy()
FragmentB: onDetach()
FragmentA: onCreateView()
FragmentA: onViewCreated()
FragmentA: onActivityCreated()
FragmentA: onStart()
FragmentA: onResume()

Объяснение: Почему при удалении и уничтожении фрагмента B с помощью popBackStack() представление фрагмента A создавалось снова и возобновлялось?

Ответ: Когда вы добавляли фрагмент B, вы использовали replace() и addToBackStack(), поэтому все фрагменты были удалены из контейнера, а фрагмент B был добавлен в контейнер. И также эта транзакция была записана в стек Back. Итак, когда вызывается fm.popBackStack(), сначала транзакция выталкивается из заднего стека, поэтому операции возвращаются, поэтому фрагмент b удаляется из контейнера и уничтожается. И все остальные фрагменты добавляются, для нашего случая представление фрагмента A добавляется в контейнер. Также отмечено, что onAttach и onCreate() фрагмента A не вызываются, потому что они уже были созданы и присоединены к MainActivity ранее.

Обратное нажатие на фрагмент B делает то же самое:

If you press the back button, it calls fm.popBackStack() and pops the transaction.
person Richa    schedule 28.02.2016
comment
Но это не уничтожит фрагмент, когда вы вернетесь или замените, я думал? Я думал, что это просто приостановлено в фоновом режиме нет? - person Burkely91; 11.07.2016
comment
Нет, он уничтожается, когда вы нажимаете кнопку «Назад». - person Richa; 14.07.2016