อะไรคือความแตกต่างระหว่างการถอด Fragment และการลบ?


118

ในเอกสาร Android สำหรับFragmentTransactionฉันสังเกตเห็นสองวิธีที่คล้ายกันมาก: detachและremove. คำอธิบายที่นั่นดูเหมือนจะไม่ให้ข้อมูลเชิงลึกมากนักเกี่ยวกับเวลาที่จะใช้แต่ละข้อและจากสิ่งที่ฉันสามารถบอกได้ว่าดูเหมือนจะเหมือนกัน

ดังนั้น: อะไรคือความแตกต่างระหว่างสองวิธีนี้?

คำตอบ:


156

เมธอด detach จะลบแฟรกเมนต์ออกจาก UI แต่สถานะจะถูกดูแลโดย Fragment Manager ซึ่งหมายความว่าคุณสามารถใช้แฟรกเมนต์นี้ซ้ำได้โดยเรียกใช้เมธอดแนบด้วย ViewHierarchy ที่ปรับเปลี่ยน

ลบหมายถึงไม่สามารถแนบอินสแตนซ์แฟรกเมนต์ใหม่ได้ คุณจะต้องเพิ่มอีกครั้งในธุรกรรมแฟรกเมนต์

ที่มาความคิดเห็น

คุณจะสังเกตเห็นว่าเมื่อแยกส่วน Fragment ออกเมธอด onPause, onStop และ onDestroyView จะถูกเรียกเท่านั้น (ตามลำดับนั้น) ในทางกลับกันเมื่อ Fragment ถูกลบออกเมธอด onPause, onStop, onDestroyView, onDestroy และ onDetach จะถูกเรียก (ตามลำดับนั้น) ในทำนองเดียวกันเมื่อแนบเมธอด onCreateView, onStart และ onResume ของ Fragment จะถูกเรียกเท่านั้น และเมื่อเพิ่มจะมีการเรียกเมธอด onAttach, onCreate, onCreateView, onStart และ onResume ของ Fragment (ตามลำดับนั้น) - Adil Hussain


145
เพื่อเพิ่มการตอบ Rajdeep ของคุณจะสังเกตเห็นว่าเมื่อFragmentเป็นแฝดของมันonPause, onStopและonDestroyViewวิธีการที่เรียกว่าเท่านั้น (ตามลำดับ) ในทางตรงกันข้ามเมื่อFragmentมีการลบออกมันonPause, onStop, onDestroyView, onDestroyและonDetachวิธีการที่เรียกว่า (ตามลำดับ) ในทำนองเดียวกันเมื่อติดที่Fragment's onCreateView, onStartและonResumeวิธีการที่เรียกว่าเท่านั้น และเมื่อเพิ่มที่Fragment's onAttach, onCreate, onCreateView, onStartและonResumeวิธีการที่เรียกว่า (ตามลำดับ)
Adil Hussain

1
มีความรวดเร็ว Q & A กับไดแอน Hackborn เป็นที่นี่ แล้วทำไมฉันถึงมีบันทึกนี้ ? คุณรู้ได้อย่างไรว่า FT.detach () ถูกเรียก?
Poutrathor

1
ประโยชน์ที่ได้รับจากอีกสิ่งหนึ่งคืออะไร? ฉันต้องการทราบกรณีการใช้งานว่ากรณีใดเป็นที่ชื่นชอบมากกว่ากัน? ฉันมักจะเพิ่มและลบมันไม่ดี?
Neon Warge

1
คำชี้แจงที่สั้นและกระชับที่สุด
Robotec

55

การตั้งชื่อวิธีการจัดการแฟรกเมนต์นั้นสับสนมากแม้ตามวิศวกรของ Google ในกระดานข้อความ (ดูความคิดเห็นด้านบน) ฉันได้สาธิตตัวเองเล็กน้อยเพื่อดูว่าสิ่งต่างๆใช้งานได้จริงอย่างไร นี่คือสิ่งที่ฉันค้นพบ อย่าลังเลที่จะแก้ไขฉันถ้าฉันผิด

ในการเพิ่ม Fragment ให้กับกิจกรรมในตอนแรกคุณใช้: getFragmentManager (). beginTransaction (). add (R.id.container, mFragment) .commit ()

สิ่งนี้เชื่อมโยงกิจกรรมกับ Fragment และเชื่อมโยง View กับ Fragment

นี่คือเหตุการณ์วงจรชีวิตที่เป็นผลลัพธ์และค่าการส่งคืนวิธีการที่สำคัญอื่น ๆ :

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

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

ในการลบ Fragment ออกจากกิจกรรมให้ใช้: 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

ในการแนบ Fragment ที่แยกออกจาก Activity อีกครั้งให้ใช้: getFragmentManager (). beginTransaction (). attach (mFragment) .commit ()

สิ่งนี้จะสร้างมุมมองใหม่เพื่อเชื่อมโยงกับ Fragment และรักษาการเชื่อมโยงกิจกรรม

นี่คือเหตุการณ์วงจรชีวิตที่เป็นผลลัพธ์และค่าการส่งคืนวิธีการที่สำคัญอื่น ๆ :

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

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

สิ่งสำคัญอื่น ๆ ที่ควรทราบ: หากคุณถอด Fragment แล้วลองเพิ่มอีกครั้งโดยใช้ add () แทนที่จะแนบ () ดูเหมือนจะไม่มีอะไรเปลี่ยนแปลง

หากคุณพยายามเพิ่ม Fragment ที่ถูกลบโดยใช้ remove () โดยใช้ attach () แทน add () ดูเหมือนว่าจะไม่มีอะไรเปลี่ยนแปลง

เมื่อ getView () คืนค่า null Fragment อาจยังคงมีการอ้างอิงภายในไปยัง View ล่าสุดที่สร้างขึ้น มุมมองนี้ใช้ไม่ได้อีกต่อไปและไม่ควรใช้


1
การทำงานที่ดี. แต่ดูเหมือนว่าน่าสนใจทีเดียวการลองติดใหม่และเพิ่มใหม่จะได้ผลเช่นเดียวกันหลังจากที่นำชิ้นส่วนออกแล้ว
stdout

9
ดังนั้นจึงกลายเป็นว่า "แนบ ()" จะไม่เรียกใช้ onAttach () "detach ()" จะไม่เรียกใช้ onDetach ()
KunYu Tsai

1
และเหตุการณ์วงจรชีวิตบางอย่างเหล่านี้อาจเปลี่ยนแปลงได้เล็กน้อยหากคุณเก็บธุรกรรมไว้ในกองหลัง
stdout
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.