2013-07-22 4 views
12

मैं वास्तव में एक टुकड़े की आंतरिक स्थिति से उलझन में हूं। मेरे पास एक गतिविधि है जो एक बार में केवल एक टुकड़ा है और इसे बदल देती है, अगर कोई अन्य टुकड़ा दिखाया जाना चाहिए। डॉक्स onSaveInstanceState से को केवल कहा जाता है यदि गतिविधि onSaveInstanceState को कॉल किया जा रहा है (जिसे मेरे मामले में नहीं कहा जाता है)।Fragments से 'onViewStateRestored` कैसे काम करता है?

अगर मैं अपना टुकड़ा रोकता हूं, तो मैं अपने राज्य को सिंगलटन के अंदर ही स्टोर करूंगा (हाँ, मुझे पता है कि मैं सिंगलेटन से भी नफरत करता हूं, लेकिन ऐसा करने का मेरा विचार नहीं था)। इसलिए मुझे पूरे ViewHirarchy को फिर से बनाना है, नए दृश्य बनाएं (कीवर्ड new का उपयोग करके), अपने राज्य को पुनर्स्थापित करें और उन्हें onCreateView पर वापस कर दें। मेरे पास इस दृश्य के अंदर एक चेकबॉक्स भी है जिसमें से मैं स्पष्ट रूप से अपने राज्य को संग्रहीत करना चाहता हूं।

हालांकि FragmentManager "बुद्धिमान" बनना चाहता है और एक बंडल के साथ onViewStateRestored कॉल मैं अपने आप को कभी नहीं बनाया है, और वर्ष CheckBox के राज्य "पुनर्स्थापित" और मेरी नई चेकबॉक्स को यह लागू होता है। यह इतने सारे प्रश्न फेंकता है:

क्या मैं onViewStateRestored से बंडल को नियंत्रित कर सकता हूं?

FragmentManager एक (शायद कचरा एकत्रित) चेकबॉक्स का राज्य कैसे लेता है और इसे नए पर लागू करता है?

क्यों यह केवल चेकबॉक्स (TextViews की नहीं ??)

तो की स्थिति यह योग करने के लिए बचाने के लिए है: कैसे onViewStateRestored काम करता है?

नोट मैं Fragmentv4 उपयोग कर रहा हूँ, इसलिए कोई एपीआई> 17 के लिए onViewStateRestored

उत्तर

17

खैर आवश्यक है, कभी कभी एक छोटे से टुकड़े भ्रामक प्राप्त कर सकते हैं, लेकिन कुछ समय बाद आप उन्हें आदत हो जाएगा, और जानने के वे कर रहे हैं कि आपके सब के बाद दोस्त

यदि आपके टुकड़े की ऑनक्रेट() विधि पर, आप करते हैं: setRetainInstance (true); आपके विचारों की दृश्य स्थिति रखी जाएगी, अन्यथा यह नहीं होगा।

एक टुकड़ा वर्ग एफ के "च" कहा जाता है मान लीजिए, अपने जीवन चक्र इस तरह जाना होगा: - जब instantiating/संलग्न/यह दिखा रहा है, उन च के तरीकों कि कहा जाता है, इस क्रम में हैं:

F.newInstance(); 
F(); 
F.onCreate(); 
F.onCreateView(); 
F.onViewStateRestored; 
F.onResume(); 

इस बिंदु पर, आपका टुकड़ा स्क्रीन पर दिखाई देगा। मान लें कि डिवाइस घुमाया गया है, इसलिए, खंड की जानकारी को संरक्षित किया जाना चाहिए, यह रोटेशन द्वारा ट्रिगर किए गए कार्यक्रमों का प्रवाह है:

F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW. 
F.onDestroyView(); //destroy any extra allocations your have made 
//here starts f's restore process 
F.onCreateView(); //f's view will be recreated 
F.onViewStateRestored(); //load your info and restore the state of f's view 
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here. 


//store the information using the correct types, according to your variables. 
@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putSerializable("foo", this.foo); 
    outState.putBoolean("bar", true); 
} 

@Override 
public void onViewStateRestored(Bundle inState) { 
    super.onViewStateRestored(inState); 
    if(inState!=null) { 
     if (inState.getBoolean("bar", false)) { 
      this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo"); 
     } 
    } 

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