2012-07-22 4 views
9

यह क्यों की सिफारिश की है (विभिन्न स्रोतों) Fragment रों के लिए निर्माता को ओवरलोड लेकिन यह करने के लिए एक Bundle गुजर के साथ स्थिर Fragment.newInstance() उपयोग करने के लिए नहीं है?Fragment.newInstance() vc onSaveInstanceState()

जब आप एक निर्माता को अधिभारित करते हैं तो आप केवल डिफ़ॉल्ट रूप से परिभाषित करते हैं। इससे पहले, onCreate() पर निकाले गए बाद के डेटा के साथ onSaveInstanceState() का उपयोग करने के कारण आपके Fragment को फिर से बनाया जाएगा। Fragment.newInstance() का उपयोग करने के साथ समान स्थिति, केवल अंतर जो आपको सार्वजनिक डिफ़ॉल्ट कन्स्ट्रक्टर बनाने की आवश्यकता नहीं है।

क्या मैं कुछ गलत समझ रहा हूं? आपका बहुत बहुत धन्यवाद।

उत्तर

27

क्यों सिफारिश की जाती है (विभिन्न स्रोत) टुकड़ों के लिए कन्स्ट्रक्टर को अधिभारित नहीं करना है, लेकिन इसके लिए बंडल पास करने के साथ स्थिर Fragment.newInstance() का उपयोग करें?

एंड्रॉइड स्वचालित रूप से कॉन्फ़िगरेशन परिवर्तन (उदाहरण के लिए, स्क्रीन रोटेशन) पर सभी गैर-बनाए गए टुकड़ों को दोबारा शुरू करता है, और इसके लिए शून्य-तर्क कन्स्ट्रक्टर का उपयोग करेगा। BundlesetArguments() के माध्यम से आपूर्ति की गई है, उदाहरण के राज्य के हिस्से के रूप में सहेजा गया है और नव निर्मित पुनर्नवीनीकरण को दिया गया है। इसलिए, आपको केवल एक विधि (फैक्ट्री विधि) को तीन (एक गैर-शून्य-तर्क कन्स्ट्रक्टर औरonSaveInstanceState()औरonViewStateRestored()) के विपरीत के रूप में लागू करने के दृष्टिकोण को लागू करना होगा।

क्या मैं कुछ गलत समझ रहा हूं?

यदि यह आपके लिए काम करता है, तो इसके लिए जाएं। जैसा कि आप ध्यान देते हैं, फैक्ट्री विधि दृष्टिकोण एक सिफारिश है, आवश्यकता नहीं है।

+0

आपके जवाब में 'onRestoreInstanceState() 'वास्तव में 'ViewStateRestored()' नहीं होना चाहिए? –

+0

@ क्रिस्टोफर पिक्सले: आप बिल्कुल सही हैं। मैं शायद 'onRestoreInstanceState()' विधि पर गतिविधि के बारे में सोच रहा था। मैंने जवाब तय कर दिया है। धन्यवाद! – CommonsWare

+0

एक अधिभारित कन्स्ट्रक्टर के बारे में क्या है जो आपकी स्थिर फैक्ट्री विधि के समान 'setArguments' को कॉल करता है? क्या यह सिर्फ इसलिए है क्योंकि यह एक कन्स्ट्रक्टर से लोगों की अपेक्षा नहीं करेगा? – Joffrey

4

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

पैरामीटर को पुनः प्राप्त करने के लिए, बस getArguments() पर कॉल करें।

getArguments().getInt("myInt", 0); 

तर्क आपके उपलब्ध होने पर भी उपलब्ध होंगे, भले ही आपकी फ्रैगमेंट पुनर्निर्मित हो।

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