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