Методы фрагмента: attach(), detach(), remove(), replace(), popBackStack()
Я очень смущен между этими функциями и их целями. Я заметил, что использование replace()
заменяет существующий фрагмент на новый. Мы можем использовать addToBackStack(null)
, чтобы поместить этот фрагмент в задний стек, чтобы мы могли вернуться к ранее показанному фрагменту. Теперь, когда фрагмент добавляется (или заменяется) - onAttach()
→ onCreate()
и т.д. Методы фрагмента вызываются по порядку.
Теперь, когда мы вызываем remove()
на фрагмент из нашей активности, какие функции этого фрагмента вызываются и в каком порядке?
Что делают attach()
и detach()
? Удаляет ли detach()
фрагмент? И когда используются эти два attach()
и detach()
, какие функции этого фрагмента вызываются и в каком порядке <
Кроме того, что происходит на popBackStack()
? Я имею в виду, какие функции вызывается, когда мы используем popBackStack()
для фрагмента из нашей активности?
И когда вызывается onDestroy()?
Спасибо.
Ответы
Ответ 1
Теперь, когда мы вызываем 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()
метод жизненного цикла onAttach()
, при отсоединении метод жизненного цикла onDetach()
вызывается во Fragment
. Для получения дополнительной информации посмотрите на ссылку выше.
Кроме того, что происходит с popBackStack()?? Я имею в виду, какие функции вызываются, когда мы используем popBackStack() для фрагмента из нашей деятельности??
Если Fragment
не был уничтожен, то для popBackStack()
onStart()
и onResume()
. Если Fragment
был уничтожен ранее, то методы жизненного цикла будут вызываться, начиная с onAttach()
. Это так же, как при нажатии кнопки "Назад" в разделе " Activities
.
Ответ 2
Просто заметьте на popBackStack()
. Он не выдает фрагмент, он выдает фрагмент транзакции. Таким образом, любая последняя транзакция фрагмента была отменена. Если вы показывали FragmentA
, и ваша транзакция была:
fragmentTransaction.replace(R.id.your_layout, fragmentB);
fragmentTransaction.addToBackStack(null);
Он заменит FragmentA
на FragmentB
и добавит эту транзакцию (а не фрагмент) в задний стек. Если вы затем нажали кнопку "Назад", он выталкивает задний стек и получает транзакцию, которая "заменила это FragmentA
на FragmentB
". Затем он отменяет эту транзакцию. В обратном порядке инструкция заключается в замене текущего фрагмента на FragmentA
. Если исходный FragmentA
все еще существует, он использует этот. Если он был уничтожен, он создает новый.
Ответ 3
Предположим, что фрагмент 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 был создан снова и возобновлен?
Ans: Когда вы добавили фрагмент B, вы использовали replace() и addToBackStack(), поэтому все фрагменты были удалены из контейнера, а фрагмент B был добавлен в контейнер. А также эта транзакция была записана в стек "Назад". Итак, когда вызывается fm.popBackStack(), сначала транзакция выталкивается из заднего стека, и поэтому операции возвращаются, поэтому фрагмент b удаляется из контейнера и уничтожается. И все остальные фрагменты добавляются, для нашего фрагмента фрагмента в контейнер добавляется представление. Также отмечено, что фрагмент A onAttach и onCreate() не вызывается, поскольку он уже был создан и прикреплен к MainActivity ранее.
Назад на фрагмент B делает то же самое:
If you press the back button, it calls fm.popBackStack() and pops the transaction.