22

हम टुकड़ों का उपयोग कर रहे हैं और गतिविधि को फिर से बनाया जाने पर हमें स्वचालित रूप से पुनर्प्राप्त होने की आवश्यकता नहीं है। लेकिन हर बार एंड्रॉइड जब Activity::onCreate(Bundle savedInstanceState) ->super.onCreate(savedInstanceState) कहा जाता है, तो हम उन टुकड़ों के लिए setRetainInstance (false) का उपयोग करते हैं, भले ही टुकड़े को पुनर्स्थापित करें।एंड्रॉइड में फ्रैगमेंट वसूली को रोकें

इसके अलावा, उन FragmentsFragment.performCreateView() में सीधे Fragment::onAttach() और बिना चलने के कहा जाता है। इसके अलावा, कुछ फ़ील्ड बहाल Fragment के अंदर शून्य हैं ...

क्या कोई जानता है कि एंड्रॉइड को टुकड़ों को बहाल करने से कैसे रोकें?

पीएस हम जानते हैं कि कॉन्फ़िगरेशन परिवर्तनों के लिए गतिविधि को पुन: प्रयास करने के मामले में इसे ndroid:configChanges="orientation|screenSize|screenLayout प्रकट करने के लिए जोड़ा जा सकता है। लेकिन स्वचालित मेमोरी सफाई के मामले में गतिविधि को पुनर्जीवित करने के बारे में क्या?

उत्तर

36

हम गतिविधि में शामिल करके समाप्त:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(null); 
} 

यह किसी भी पुन:/बनाने एक गतिविधि के चक्र पर डेटा सहेजा घटाती है तथा बचा जाता है स्वत: पुन: निर्माण विखंडित।

+1

सरल अभी तक इतना प्रभावी है। यह वास्तव में एक मौजूदा खराब डिजाइन (1 गतिविधि एप + 1 स्क्रीन प्रति स्क्रीन) के साथ अपने गधे को बचाया। – momo

+0

अगर टुकड़े में कुछ यूआई है तो आपको लगता है कि यह एक खराब उपयोगकर्ता अनुभव नहीं है। –

+2

यह एक आकर्षण की तरह काम करता है, लेकिन मुझे उम्मीद है कि ऐसा करने का एक क्लीनर तरीका है ... – jenzz

-1

पदानुक्रम स्वचालित रूप से पुनर्स्थापित नहीं किया गया देखें। तो, Fragment.onCreateView() या Activity.onCreate() में, आपको सभी विचारों को पुनर्स्थापित करना होगा (xml या प्रोग्रामेटिक रूप से)। प्रत्येक व्यू ग्रुप जिसमें एक खंड होता है, वही आईडी होना चाहिए जब आपने इसे पहली बार बनाया था। एक बार दृश्य पदानुक्रम बनने के बाद, एंड्रॉइड सभी टुकड़ों को पुनर्स्थापित करता है और आईडी के लिए सही दृश्य समूह धन्यवाद में अपना विचार डालता है। मान लें कि एंड्रॉइड व्यू ग्रुप की आईडी को याद करता है जिस पर एक टुकड़ा था। यह onCreateView() और onStart() के बीच कहीं होता है।

+4

दुर्भाग्य से, यह स्वचालित रूप से बहाल हो गया है ... – goRGon

0

मैंने गतिविधि के ऑनक्रेट में टुकड़े हटा दिए।

7

@goRGon का जवाब मेरे लिए बहुत उपयोगी था, लेकिन ऐसे उपयोग गंभीर समस्याएं पैदा करते हैं जब आपको कुछ और जानकारी मिलती है जो आपको फिर से बनाने के बाद अपनी गतिविधि के लिए आगे बढ़ने की आवश्यकता होती है।

यहां बेहतर संस्करण है जो केवल "टुकड़े" को हटा देता है, लेकिन हर दूसरे पैरामीटर को बनाए रखता है।

बंडल से हटाई गई आईडी android.support.v4.app.FragmentActivity कक्षा FRAGMENTS_TAG फ़ील्ड के हिस्से का हिस्सा है। यह निश्चित रूप से समय के साथ बदल सकता है, लेकिन इसकी उम्मीद नहीं है।

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(createBundleNoFragmentRestore(savedInstanceState)); 
} 

/** 
* Improve bundle to prevent restoring of fragments. 
* @param bundle bundle container 
* @return improved bundle with removed "fragments parcelable" 
*/ 
private static Bundle createBundleNoFragmentRestore(Bundle bundle) { 
    if (bundle != null) { 
     bundle.remove("android:support:fragments"); 
    } 
    return bundle; 
} 
+0

कमाल। ठीक वही जो मेरे द्वारा खोजा जा रहा था – Bolein95

1

जो लोग ViewPager साथ एनपीई मिला, जब उपयोग इस विधि स्वीकार किए जाते हैं जवाब में वर्णित है, ओवरराइड

ViewPager.onRestoreInstanceState(Parcelable state)

विधि और इसके बजाय

super.onRestoreInstanceState(null);

कॉल करें।

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