2012-10-07 3 views
5

पहले से इस मुद्दे के बारे में खोज करने के बाद, मैं ViewPager से चयनित Fragment एस गतिशील रूप से जोड़ने और हटाने के बारे में कई चर्चाएं पा सकता हूं। मैं वास्तव में यहां के बारे में चिंतित हूं हालांकि मैं से ViewPager 'क्लीनली' को प्रोग्रामेटिक रूप से हटा सकता हूं, जब ViewPagerFragment एस FragmentPagerAdapter के माध्यम से प्रदर्शित करने के लिए उपयोग किया गया है, और सुनिश्चित करें कि Fragment एस ठीक से नष्ट हो गए हैं ।प्रोग्रामेटिक रूप से एक व्यूपेगर को हटा रहा है, जब (या मैं कैसे सुनिश्चित कर सकता हूं) में फ्रेगमेंट नष्ट हो गए हैं?

प्रश्न पर विस्तार करने के लिए, मेरे पास एक लैंडस्केप दो-फलक लेआउट है जहां एक चयन को Fragment के भीतर बाईं ओर स्थित सूची में बनाया गया है, और चुनी गई सामग्री को दाईं ओर दाईं ओर रखा गया है एक FrameLayout। मुख्य बात यह है कि सामग्री पेजिनेटेड हो सकती है या नहीं। इसलिए, सामग्री को या तो ViewPager स्वरूप में प्रदर्शित किया जाना चाहिए, या यदि यह पृष्ठबद्ध नहीं है तो इसे सीधे Fragment द्वारा दर्शाया जाएगा।

एक भी Fragment दिखाने के लिए, मैं बस एक FragmentTransaction प्रदर्शन के रूप में आप सामान्य रूप से होता क्रम में FragmentFrameLayout कंटेनर में जगह। यदि दूसरी तरफ यह चित्रित सामग्री दिखाया जा सकता है, तो इसके बजाय मैं ViewPager बना देता हूं और इसे FrameLayout के बच्चे के रूप में जोड़ता हूं।

जब मुझे सामग्री को बदलने की आवश्यकता होती है, तो यदि पिछली सामग्री स्टैंड-अलोन Fragment थी तो मैं इसे FragmentTransaction.remove() के माध्यम से हटा सकता हूं। जब मैं ऐसा करता हूं, FragmentonPause() ... onDestroy() चक्र के अनुसार चला जाता है। यदि पिछली सामग्री ViewPager थी तो मैं इसे से .removeAllViews() का उपयोग कर हटा देता हूं। यहां मैं समस्या पर आ गया हूं: मुझे onPause() में से कोई भी नहीं दिख रहा है ... onDestroy()Fragment एस में से किसी भी तरीके से कॉल किया जा रहा है जो के भीतर FragmentPagerAdapter के माध्यम से आयोजित किए गए थे।

उपयोगकर्ता के दृष्टिकोण से, एप्लिकेशन ठीक काम करता है। ViewPager के कई राउंड हटाने के बाद, मैं जीसी पुनः दावा स्मृति देख सकता हूं। हालांकि, मुझे इस तथ्य को पसंद नहीं है कि उन Fragment एस 'जीवन विधियों के अंत को नहीं कहा जाता है क्योंकि मैं उनके भीतर कोई सफाई नहीं कर सकता, और यह सिर्फ' सही 'प्रतीत नहीं होता है।

क्या ViewPager के Fragment एस को हटाने के लिए कोई विधि है जिसमें मैं ViewPager को अपने माता-पिता से अलग कर सकता हूं, शायद? दूसरे शब्दों में, जब मुझे पता है कि ViewGroup अब उपयोग में नहीं है, तो मैं Fragment एस को हटाने के लिए FragmentTransaction एस कहीं (शायद FragmentPagerAdapter में) प्रदर्शन करता हूं।

वैकल्पिक रूप से, मुझे एहसास है कि मैं केवल ViewPager को स्थायी रूप से सही रख सकता हूं, और इसके भीतर Fragment एस गतिशील रूप से स्वैप कर सकता हूं। बेशक यह कोई फर्क नहीं पड़ता कि कुछ समय पर यह केवल एक पेज धारण करेगा। यदि यह जाने का एक बेहतर तरीका होगा तो मैं ऐसा करने के लिए अपने कोड को दोबारा कर दूंगा, लेकिन मैं राय की सराहना करता हूं।

उत्तर

12

हालांकि, मुझे यह तथ्य पसंद नहीं है कि उन टुकड़ों के जीवन विधियों के अंत को नहीं कहा जाता है क्योंकि मैं उनके भीतर कोई सफाई नहीं कर सकता, और यह सिर्फ 'सही' प्रतीत नहीं होता है।

गतिविधि समाप्त होने पर उन्हें साफ़ किया जाना चाहिए, यदि आपके लिए बहुत देर हो चुकी है (उदाहरण के लिए, ढेर मुद्दे)।

दूसरे शब्दों में, जब मुझे पता है कि ViewGroup में प्रयोग किया जाता है, मैं FragmentTransactions कहीं प्रदर्शन करेंगे (शायद FragmentPagerAdapter में) उन टुकड़े को दूर करने के नहीं रह गया है।

आपने वहां टुकड़े लगाने के लिए लेनदेन निष्पादित नहीं किए। इसलिए, आप टुकड़ों को हटाने के लिए लेनदेन को आसानी से निष्पादित नहीं कर सकते हैं। यदि आप FragmentStatePagerAdapter पर स्विच करते हैं, और setAdapter(null) पर कॉल करते हैं, तो स्रोत कोड के पढ़ने से, पेजर में सभी मौजूदा टुकड़े नष्ट हो जाएंगे। FragmentPagerAdapter कभी नहीं remove() का उपयोग करता है, लेकिन इसकी destroyItem() विधि से FragmentStatePagerAdapter करता है, और सभी मौजूदा टुकड़े destroyItem() के माध्यम से नष्ट कर रहे हैं जब एक नया अनुकूलक (या null) setAdapter() लिए आपूर्ति की है।

+1

धन्यवाद। एक समाधान जो मैं अभी आया था, 'फ्रैगमेंट' को हटाने के लिए 'नष्ट करें' के भीतर 'FragmentManager' का उपयोग करना है। मैं 'getItemPosition' से 'PagerAdapter.POSITION_NONE' भी वापस लौटाता हूं और' NotifyDataSetChanged()' को कॉल करता हूं। 'ViewPager' को हटाने से पहले ऐसा करके,' Fragment's '' onDestroy' कहा जाता है और मैं खुश हूं। क्या आप इसके साथ कोई समस्या देखते हैं? 'FragmentPagerAdapter' का उपयोग करने का कारण यह है क्योंकि मैं सभी' Fragment's (एक छोटी संख्या) को चारों ओर रहने के लिए चाहता हूं, क्योंकि मेरे UI को यह आवश्यक है कि एक ही स्वीकृति बटन कार्रवाई के जवाब में उपयोगकर्ता डेटा सभी टुकड़ों से बने रहे। – Trevor

+1

@ ट्रेवर: "क्या आप इसके साथ कोई समस्या देखते हैं?" - यह ठीक होना चाहिए, हालांकि एंड्रॉइड सपोर्ट पैकेज में किसी भी अपडेट को लेने पर सावधान रहें। हम सभी जानते हैं कि वे व्यवहार को बदल देंगे जैसे कि एंड्रॉइड भी टुकड़ों को नष्ट करने की कोशिश करता है, और आप त्रुटियों के साथ हवादार हो सकते हैं और अपने स्वयं के विनाश तर्क को वापस लेना होगा। – CommonsWare

+1

फिर से धन्यवाद, और समझा। लगता है कि अब मेरे पास क्या है, तो दोनों दुनिया में सबसे अच्छा है: 'FragmentPagerAdapter' का उपयोग करना मतलब है कि' फ्रैगमेंट 'से दूर पेजिंग इसे नष्ट नहीं करती है, लेकिन' FragmentStatePagerAdapter' की तरह खंड को हटाने के लिए 'नष्ट करें' को बढ़ाकर, मैं कर सकता हूं जब मैं चाहता हूं तो टुकड़े हटा दें। (मैं चारों ओर रहने के लिए सभी संलग्न टुकड़ों की आवश्यकता की सराहना करता हूं ताकि मैं उनसे अनुरोध कर सकूं कि उपयोगकर्ता-इनपुट डेटा को एक बार में फेंक दिया जा सके, लेकिन अन्यथा मुझे रिफैक्टर करना होगा ताकि सभी टुकड़े इस डेटा को मुख्य गतिविधि में पारित कर सकें, जिसे मैं '' बल्कि इससे बचें।) – Trevor

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

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