एक टुकड़े को अलग करने और इसे हटाने के बीच क्या अंतर है?


118

एक FragmentTransaction के लिए एंड्रॉइड डॉक्स में मैंने दो समान तरीकों पर ध्यान दिया: detachऔर remove। वहाँ के विवरण प्रत्येक का उपयोग करने के बारे में बहुत जानकारी प्रदान नहीं करते हैं, और जो मैं बता सकता हूं कि वे एक ही प्रतीत होते हैं।

तो: इन दो तरीकों के बीच अंतर क्या हैं?

जवाबों:


156

टुकड़ी विधि यूआई से टुकड़े को हटा देती है, लेकिन इसका राज्य फ्रैगमेंट मैनेजर द्वारा बनाए रखा जाता है। इसका मतलब है कि आप संशोधित विधि के साथ एक संशोधित ViewHierarchy कॉल करके इस टुकड़े का पुनः उपयोग कर सकते हैं

निकालें का अर्थ है कि टुकड़े का उदाहरण फिर से संलग्न नहीं किया जा सकता है। आपको इसे फिर से विखंडन लेनदेन में जोड़ना होगा।

स्रोत टिप्पणी

आप देखेंगे कि जब एक फ़्रैगमेंट को अलग किया जाता है, तो उसके ऑनपॉज़, ऑनटॉप और ऑनडस्ट्रो व्यू तरीकों को केवल (उस क्रम में) कहा जाता है। दूसरी ओर, जब एक विखंडन को हटा दिया जाता है, तो उसके ऑनपॉज़, ऑनटॉप, ऑनडस्ट्रो व्यू, ऑनडेस्ट्रॉय और ऑनडैच विधियों को कहा जाता है (उस क्रम में)। इसी तरह, जब संलग्न होते हैं, तो फ्रैगमेंट का ऑनक्रिएट व्यू, ऑनस्टार्ट और ऑनस्क्यूम विधियां ही कहलाती हैं; और जब जोड़ते हैं, तो Fragment के onAttach, onCreate, onCreateView, onStart और onResume विधियाँ (उस क्रम में) कहलाती हैं। - आदिल हुसैन


145
राजदीप के जवाब देने के लिए जोड़ने के लिए, आप ध्यान देंगे कि जब एक Fragmentहै अलग , अपने onPause, onStopऔर onDestroyViewतरीकों को कहा जाता है (इसी क्रम में)। दूसरी ओर, जब एक पर Fragmentहै हटा दिया है, इसके onPause, onStop, onDestroyView, onDestroyऔर onDetachतरीकों कहा जाता है (इसी क्रम में)। इसी प्रकार, संलग्न करते समय , Fragment's onCreateView, onStartऔर onResumeविधियों को ही कहा जाता है; और जब जोड़ने , Fragmentके onAttach, onCreate, onCreateView, onStartऔर onResumeविधियों (इसी क्रम में) कहा जाता है।
आदिल हुसैन

1
डायने हैकॉर्न के साथ यहां एक तेज क्यू एंड ए है । तो मेरे पास यह लॉग क्यों है ? आप कैसे जानते हैं कि FT.detach () को बुलाया गया है?
पौटरथोर

1
एक दूसरे के ऊपर क्या लाभ होगा? मैं एक उपयोग के मामले को जानना चाहता हूं जब एक दूसरे पर अनुकूल हो? मैं हमेशा जोड़ और हटाता हूं, क्या यह बुरा है?
नियॉन वेज

1
सर्वश्रेष्ठ लघु और संक्षिप्त स्पष्टीकरण।
रोबॉटेक सेप

55

संदेश बोर्डों पर Google इंजीनियरों के अनुसार भी फ़्रेग्मेंट मैनेजमेंट के तरीकों का नामकरण बहुत भ्रामक है। मैंने खुद को यह पता लगाने के लिए थोड़ा डेमो किया कि चीजें वास्तव में कैसे काम करती हैं। यहाँ मेरे निष्कर्ष हैं। अगर मैं गलत हूं तो मुझे सुधारने के लिए स्वतंत्र महसूस करें।

प्रारंभ में किसी गतिविधि में एक फ़्रैगमेंट जोड़ने के लिए, आप का उपयोग करें: getFragmentManager ()। शुरुआती प्रतिक्रिया () जोड़ें (R.id.container, mFragment) .commit ()।

यह गतिविधि को फ़्रैगमेंट के साथ जोड़ता है और फ़्रैगमेंट के साथ एक दृश्य भी जोड़ता है।

यहां परिणामी जीवन चक्र घटनाएं और अन्य महत्वपूर्ण विधि रिटर्न मान हैं:

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

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

किसी गतिविधि से एक फ़्रैगमेंट निकालने के लिए, आप उपयोग करें: getFragmentManager ()। StartTransaction ()। Remove (mFragment) .commit ()।

यह किसी भी एसोसिएशन को व्यू या एक्टिविटी से हटा देता है।

यहां परिणामी जीवन चक्र घटनाएं और अन्य महत्वपूर्ण विधि रिटर्न मान हैं:

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

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

मैंने यहां के टुकड़े को फिर से जोड़ा

किसी गतिविधि से एक अतिरिक्त फ्रैगमेंट को अलग करने के लिए, आप का उपयोग करें: getFragmentManager ()। StartTransaction ()। Detach (mFragment) .commit ()।

यह किसी भी एसोसिएशन को व्यू के साथ हटा देता है, लेकिन एक्टिविटी के साथ एसोसिएशन को बनाए रखता है।

यहां परिणामी जीवन चक्र घटनाएं और अन्य महत्वपूर्ण विधि रिटर्न मान हैं:

onPause()                             
onStop()                              
onDestroyView()                      

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

एक फ्रैगमेंट को फिर से संलग्न करने के लिए जो गतिविधि के लिए अलग किया गया था, आप का उपयोग करें: getFragmentManager ()। startTransaction ()। संलग्न करें (mFragment) .commit ()।

यह फ्रैगमेंट के साथ जुड़ने के लिए एक नया दृश्य बनाता है और गतिविधि संघ को बनाए रखता है।

यहां परिणामी जीवन चक्र घटनाएं और अन्य महत्वपूर्ण विधि रिटर्न मान हैं:

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

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

ध्यान देने योग्य अन्य महत्वपूर्ण बातें: यदि आप एक फ्रैगमेंट को अलग करते हैं और फिर इसे जोड़ने के बजाय फिर से जोड़कर () का उपयोग करके जोड़ने की कोशिश करते हैं, तो कुछ भी नहीं बदलता है।

यदि आप एक जोड़ जोड़ने की कोशिश करते हैं जिसे हटाने () को जोड़ने () के बजाय अटैच () का उपयोग करके हटा दिया गया है, तो कुछ भी नहीं लगता है।

जब दृश्य () रिटर्न शून्य हो जाता है, तो फ्रेगमेंट में अभी भी बनाए गए अंतिम दृश्य के आंतरिक संदर्भ हो सकते हैं। यह दृश्य अब मान्य नहीं है और इसका उपयोग नहीं किया जाना चाहिए।


1
अच्छा कार्य। लेकिन यह काफी दिलचस्प लग रहा था कि टुकड़े को हटाने के बाद फिर से जोड़ना और फिर से जोड़ना एक ही प्रभाव है।
stdout

9
तो यह पता चला कि "अटैच ()" onAttach () को लागू नहीं करेगा। "detach ()" onDetach () को इनवोक नहीं करेगा।
कुनयु त्सई

1
और यदि आप बैक स्टैक में लेन-देन रखते हैं तो इनमें से कुछ जीवनचक्र की घटनाओं में थोड़ा बदलाव आ सकता है।
stdout
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.