Яка різниця між відокремленням фрагмента та його видаленням?


118

У документах Android для FragmentTransaction я помітив два дуже схожі методи: detachі remove. Описи там, схоже, не дають багато розуміння того, коли використовувати кожен, і з того, що я можу сказати, вони здаються однаковими.

Отже: чим відрізняються ці два методи?

Відповіді:


156

Метод від'єднання видаляє фрагмент з інтерфейсу користувача, але його стан підтримує менеджер фрагментів. Це означає, що ви можете повторно використовувати цей фрагмент, зателефонувавши до методу приєднання, із зміненою ViewHierarchy

Видалити означає, що екземпляр фрагмента неможливо повторно приєднати. Вам доведеться знову додати його до транзакції з фрагментом.

Коментар джерела

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


145
Для того, щоб додати відповідь Rajdeep, ви помітите , що , коли Fragmentце окремо стоїть , його onPause, onStopі onDestroyViewметоди називаються тільки (в такому порядку). З іншого боку, коли Fragmentбуде видалена , її onPause, onStop, onDestroyView, onDestroyі onDetachметоди називаються (в зазначеному порядку). Аналогічним чином , коли прикріплення , то Fragment«и onCreateView, onStartі onResumeметоди називаються тільки; і коли додавання , що Fragment«и onAttach, onCreate, onCreateView, onStartі onResumeметоди називаються (в зазначеному порядку).
Аділь Хуссей

1
Існує швидкий Q & А з Діаною Hackborn тут . То чому я маю цей журнал? Звідки ви знаєте, що викликано FT.detach ()?
Путратор

1
Яка користь одного над іншим? Я хочу знати випадок використання, коли один сприятливий для іншого? Я завжди додаю і видаляю, це погано?
Неонова війна

1
Краще коротке і стисле уточнення.
Robotec

55

Називання методів управління фрагментами дуже заплутано навіть на думку інженерів 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 (). Remove (mFragment) .commit ().

Це видаляє будь-яку асоціацію з представленням даних або з діяльністю.

Ось отримані події життєвого циклу та інші важливі методи повернення значень:

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

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

Я знову додав тут фрагмент

Щоб від'єднати доданий фрагмент від активності, ви використовуєте: getFragmentManager (). BeginTransaction (). Detach (mFragment) .commit ().

Це видаляє будь-яку асоціацію з представленням даних, але зберігає зв'язок із активністю.

Ось отримані події життєвого циклу та інші важливі методи повернення значень:

onPause()                             
onStop()                              
onDestroyView()                      

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

Для повторного вкладення фрагмента, від'єднаного до Діяльності, ви використовуєте: getFragmentManager (). BeginTransaction (). Attach (mFragment) .commit ().

Це створює новий Вид для асоціації з Фрагментом і підтримує асоціацію Діяльність.

Ось отримані події життєвого циклу та інші важливі методи повернення значень:

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

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

Інші важливі речі, які слід зазначити: Якщо ви вилучите фрагмент, а потім спробуйте додати його знову, використовуючи додавання (), а не прикріплення (), ніби нічого не зміниться.

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

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


1
Гарна робота. Але здавалося досить цікавим спроби повторного прикріплення та повторного додавання мають той же ефект після вилучення фрагмента.
stdout

9
Так вийшло, що "attach ()" не посилатиметься на onAttach (). "detach ()" не буде викликати onDetach ().
KunYu Tsai

1
І деякі з цих подій життєвого циклу можуть трохи змінитися, якщо зберігати транзакції в задній стеці.
stdout
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.