2012-06-20 21 views
34

जब एक टुकड़ा को हटाने मैं savedInstanceState() उपयोग कर सकते हैं राज्य को बचाने के लिए से टुकड़ा बहाल है, तो राज्य जब मैं वापस ढेर बंद टुकड़ा पॉप बहाल? जब मैं बैक स्टैक से टुकड़ा बहाल करता हूं, सहेजे गए इंस्टेंसस्टेट बंडल हमेशा शून्य होता है।savedInstanceState जब वापस ढेर

अभी, ऐप प्रवाह है: खंड बनाया गया -> खंड हटा दिया गया (वापस ढेर में जोड़ा गया) -> बैक स्टैक से सहेजा गया टुकड़ा (सहेजा गया इंस्टेंसस्टेट बंडल शून्य है)।

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Bundle bundle = getArguments(); 
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID); 
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID); 

    if (savedInstanceState == null) { 
     selectedVideoNumber = playlistItemId; 
    } else { 
     selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO"); 
    } 
} 

public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber); 
    } 

मुझे लगता है कि समस्या यह है कि onSavedInstanceState() जब हटाया जा रहा है और ढेर वापस करने के लिए जोड़ा जा रहा है कभी नहीं कहा जाता है:

यहाँ प्रासंगिक कोड है। अगर मैं onsavedInstanceState() का उपयोग नहीं कर सकता, तो क्या इसे ठीक करने का कोई और तरीका है?

उत्तर

0

FWIW जवाब, मैं इस के रूप में अच्छी तरह से मारा, लेकिन मेरे मामले में onSaveInstanceState ठीक से बुलाया गया था और मैं अपने राज्य डेटा में धक्का दे दिया जब एक नई गतिविधि टुकड़ा स्मार्टफोन पर लाया गया था। आपके जैसा ही, एक्टिविटीक्रेटेड को w/savedInstanceState हमेशा शून्य कहा जाता था। आईएमएचओ, मुझे लगता है कि यह एक बग है।

मैं इसे चारों ओर एक स्थिर MyApplication राज्य बनाने और "वैश्विक चर" के समकक्ष के लिए वहाँ डेटा रख कर काम किया ...

5

मुझे लगता है मैं एक वैश्विक चर और उसके बाद के रूप में onCreateView में वापसी देखें संग्रहीत करना चाहते जब मैं वापस आ मैं बस यह जाँच:

if(mBaseView != null) { 
     // Remove the view from the parent 
     ((ViewGroup)mBaseView.getParent()).removeView(mBaseView); 
     // Return it 
     return mBaseView; 
    } 
+0

कई धन्यवाद :) इसकी मेरी समस्या हल –

+6

यकीन नहीं है कि यह एक अच्छा विचार है। यदि आप इसका संदर्भ सहेजते हैं तो क्या यह स्मृति को मुक्त करने के उद्देश्य को नष्ट करने का उद्देश्य है? – craigrs84

+0

मुझे वास्तव में यकीन नहीं है, क्योंकि मैंने कोई प्रत्यक्ष परीक्षण नहीं किया है। हालांकि, मेरी सोच इस तरह जाती है।जब आप अपने लेआउट में सभी तत्वों को प्रारंभ करते हैं, तो उन तत्वों को वैश्विक चर के रूप में सेट करने के लिए मानक है, इसलिए यदि उपरोक्त उदाहरण में मैं संदर्भ के कारण मूल दृश्य को रीसायकल नहीं कर सका, तो एंड्रॉइड रीसायकल करने में सक्षम नहीं होगा इनमें से कोई भी दृश्य या तो स्मृति के साथ एक ही समस्या का कारण बनता है। – AllDayAmazing

4

समस्या यह है कि टुकड़ा की जरूरत है एक Id या TagFragmentManager के लिए है ताकि इसे का ट्रैक रखने के में इसके साथ जुड़े।

ऐसा करने के कम से कम 3 तरीके हैं:

  1. XML लेआउट में अपने टुकड़ा के लिए एक Id घोषित:

    android:[email protected]+id/<Id> 
    
  2. अपने टुकड़े कंटेनर View एक Id है, तो FragmentTransaction का उपयोग :

    FragmentTransaction add (int containerViewId, Fragment fragment) 
    
  3. अपने टुकड़ा किसी भी View के साथ जुड़ा नहीं है (उदा बिना सिर टुकड़ा), यह एक Tag दे:

    FragmentTransaction add (Fragment fragment, String tag) 
    

Also, see this SO answer.

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