2011-08-19 12 views
37

मेरे पास एक Activity है। Activity में दो Fragment एस है। टुकड़ा ए मेनू है। टुकड़ा बी विवरण है।टुकड़े को कैसे नष्ट करें?

मैं फ्रैगमेंट बी में अन्य फ्रैगमेंट सी बनाने की कोशिश करता हूं, इसलिए Activity में 3 टुकड़े हैं। और मैं फ्रैगमेंट बी को फ्रैगमेंट डी को बदलने की कोशिश करता हूं

मुझे लगता है कि टुकड़ा बी और सी मर चुका है। लेकिन ये टुकड़े जीवित हैं। बस टुकड़े onDestroyView() राज्य हैं। मुझे onDestroy() या onDetach() चाहिए।

Fragments.onDestroy() या onDetach() के लिए मैं क्या करूँ? मैं Activity को नष्ट या परिवर्तित नहीं कर सकता।

+0

आप जगह कर रहे हैं में वापस ढेर में जोड़कर प्रयोग किया जाता है? यदि ऐसा है तो मुझे टुकड़े को नष्ट करने की उम्मीद नहीं है। यदि आप एक प्रतिस्थापन पर बैक स्टैक पर लेनदेन नहीं जोड़ते हैं। – PJL

उत्तर

54

यदि आप मैन्युअल रूप से इन टुकड़ों को नहीं हटाते हैं, तो वे अभी भी गतिविधि से जुड़े हुए हैं। आपकी गतिविधि नष्ट नहीं हुई है इसलिए ये टुकड़े भी हैं। निकालने के लिए (ताकि नष्ट) इन टुकड़े, आप कॉल कर सकते हैं:

fragmentTransaction.remove(yourfragment).commit() 

आशा है कि यह मदद करता है करने के लिए आप

+0

इससे मुझे डरावनी "डुप्लिकेट आईडी" दुर्घटना में मदद मिली। धन्यवाद! – xorgate

+0

जब एक टुकड़ा हटा दिया जाता है, तो कौन सा टुकड़ा जीवन चक्र विधि कहा जाता है? इसी प्रकार, जब एक टुकड़ा प्रतिस्थापित किया जाता है तो खंड जीवन चक्र की किस विधि को बुलाया जाता है? –

+4

वाह, यह Google के दस्तावेज़ को प्रतिस्थापित करने के लिए पूरी तरह से गलत बनाता है: "यह अनिवार्य रूप से वही कंटेनर व्यूआईडी के साथ जोड़े गए सभी मौजूदा खंडों के लिए कॉलिंग निकालना (टुकड़ा) जैसा ही है और फिर (int, Fragment, String) जोड़ें यहां दिए गए वही तर्क। '' जब हकीकत में, केवल कॉलिंग को हटा दें() टुकड़े को नष्ट कर देता है और प्रतिस्थापित नहीं करता है। – 0101100101

9

इस

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    // TODO Auto-generated method stub 

    FragmentManager manager = ((Fragment) object).getFragmentManager(); 
    FragmentTransaction trans = manager.beginTransaction(); 
    trans.remove((Fragment) object); 
    trans.commit(); 

    super.destroyItem(container, position, object); 
} 
2

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

getFragmentManager()। startTransaction()। हटाएं (yourFragment) .commitAllowingStateLoss();

या यदि आप supportLib उपयोग कर रहे हैं, तो आप कॉल करने के लिए की जरूरत है:।।

getSupportFragmentManager() beginTransaction() को हटाने (yourFragment) .commitAllowingStateLoss();

संबंधित मुद्दे