2013-09-05 4 views
11

वास्तव में, मैं हमेशा निम्नलिखित की तरह मेरे टुकड़े में मेरे विचार पुन: उपयोग:टुकड़ा - क्या मुझे क्रिएटिव्यू में दृश्य का पुन: उपयोग करना चाहिए और मुझे यह कैसे करना चाहिए?

private View mView = null; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
    if (mView == null) 
     mView = inflater.inflate(R.layout.view); 
    return mView; 
} 

यही काम किया, viewpager साथ और इतने पर। अब मैं तथा साथ ही अगर सरल गतिविधियों में मेरी टुकड़े का उपयोग शुरू किया और वह भी तब, मैं backstack को टुकड़ा जोड़ने के लिए, यह तो मेरी सवाल कर रहे हैं java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

की वजह से असफल हो जायेगी:

  • यह ठीक है , अगर मैं विचारों को माता-पिता की जांच करता हूं, तो इसे हटा दें और इसे नए माता-पिता में जोड़ें?
  • या क्या मुझे हमेशा दृश्य को फिर से बनाना चाहिए और इसका पुन: उपयोग नहीं करना चाहिए? यदि हां, क्यों?
  • क्या कोई अन्य बिंदु हैं, जहां दृश्य का पुन: उपयोग विफल हो जाएगा?

उत्तर

11

शायद यह व्यवहार को समझने में मदद कर सकता है। आप की जाँच तो FragmentManagerImpl.java आप निम्नलिखित मिलेगा:

पहले हम onCreateView() (लाइन 845) और फिर हम एक और दृश्य है, जो हमारे विचार से एक माता पिता बन जाता है के साथ बनाए गए दृश्य लपेट (लाइनों 848 को फोन करके दृश्य बनाने -849)। इसका मतलब है कि हमारा विचार वास्तविक कंटेनर का बच्चा नहीं बनता है, लेकिन यह अब एक रैपर दृश्य का बच्चा है। पुन: उपयोग की समस्या तब होती है जब दृश्य कंटेनर से हटा दिया जाता है (लाइन 998)। FragmentManager कंटेनर से रैपर दृश्य को हटा देता है, लेकिन हमारा वास्तविक दृश्य मूल रैपर दृश्य में जोड़ा जाता है। यही कारण है कि आप जिस मुद्दे का अनुभव करते हैं उसका कारण बनता है।

इस प्रकार, यदि आप अपने माता-पिता से दृश्य हटाते हैं, तो यह काम कर सकता है। यहां तक ​​कि यह जानने के लिए, मैं टुकड़े में विचारों का पुन: उपयोग करने की भी सिफारिश नहीं करता क्योंकि विचार टुकड़ों की तुलना में थोड़ा अधिक समय तक जीवित रह सकते हैं, क्योंकि टुकड़े नष्ट होने के बाद भी उन्हें "गायब" एनिमेशन में उपयोग किया जा सकता है। यदि आप उस समय अपने माता-पिता से इस तरह के दृश्य को हटाने का प्रयास करते हैं, तो एनीमेशन टूटा जा सकता है।

दृश्य को कैश करने का एक अन्य तर्क यह नहीं है कि एंड्रॉइड डिज़ाइन द्वारा टुकड़ों में दृश्य रीसाइक्लिंग का समर्थन नहीं करता है। ListAdapter विचारों का पुन: उपयोग करने की अनुमति याद रखें? एंड्रॉइड कैशिंग के लिए देखभाल करता है और उन विचारों का उचित पुन: उपयोग करता है। यद्यपि यह टुकड़ा के साथ मामला नहीं है।

if(view == null){ 
    view = (ViewGroup) inflater.inflate(R.layout.news_list, container, false); 
} else { 
    ((ViewGroup) view.getParent()).removeView(view); 
} 
return view; 

अगर इस तरह से सही है मैं नहीं जानता, लेकिन यह मेरे लिए काम करने लगता है ..

नोट::

+0

इस स्पष्टीकरण के लिए धन्यवाद, जो मुझे यह स्पष्ट करता है कि – prom85

6

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

+0

हाय @ एडर्रेन आपका समाधान ठीक काम करता है लेकिन यह कंटेनर से दृश्य को हटा नहीं रहा है, यहां तक ​​कि मैंने अपना टुकड़ा पॉप किया है। –

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