2013-06-22 10 views
8

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

तथ्य:

  1. दोनों टुकड़े public static TheFragment newInstance(Bundle args), setArguments(args) और Bundle args = getArguments()
  2. दोनों टुकड़े एक ही स्तर, जो सीधे माता पिता गतिविधि से एक FrameLayout (अंदर है पर हैं के माध्यम से बनाए जाते हैं, नेस्ट टुकड़े नहीं है)
  3. मैं setRetainInstance पर कॉल नहीं करना चाहता, क्योंकि मेरी गतिविधि एक मास्टर/विस्तार प्रवाह है, जिसमें बड़ी स्क्रीन पर 2 फलक लेआउट है। 7 "टैबलेट में चित्र में 1 फलक और परिदृश्य में 2 पैन हैं। अगर मैं 'सूची' खंड उदाहरण को बरकरार रखता हूं, तो यह स्क्रीन रोटेशन के साथ चीजों को बकवास करेगा (0 मुझे लगता है)
  4. जब उपयोगकर्ता 'सूची' में किसी आइटम पर क्लिक करते हैं टुकड़ा, 'सामग्री' टुकड़ा एक ही आईडी लेकिन एक अलग टैग
  5. मैं ओवरराइड था onSaveInstanceState(Bundle) साथ FragmentTransaction#replace(int, Fragment, String) के माध्यम से प्रदर्शित किया जाता है, है, लेकिन यह नहीं हमेशा ढांचे द्वारा कहा जाता है, के रूप में per the doc: "कई स्थितियों में, जहां कर रहे हैं एक टुकड़ा ज्यादातर तोड़ा जा सकता है (जैसे कि जब यूआई दिखाए बिना बैक स्टैक पर रखा जाता है), लेकिन इसकी स्थिति तब तक सहेजी नहीं जाएगी जब तक कि इसकी अपनी गतिविधि को वास्तव में अपने राज्य को बचाने की आवश्यकता न हो। "
  6. मैं समर्थन पुस्तकालय

उपयोग कर रहा हूँ ऊपर गोली 5 से, मुझे लगता है कि है कि कम अंत उपकरणों एक टुकड़ा लेन-देन के बाद स्मृति को ठीक करने की जरूरत है कि Fragment#onSaveInstanceState(Bundle) कह सकते हैं। हालांकि, मेरे परीक्षण उपकरणों (गैलेक्सी नेक्सस और नेक्सस 7) पर, ढांचा उस विधि को कॉल नहीं करता है। तो यह एक वैध विकल्प नहीं है।

तो, मैं कुछ खंड डेटा कैसे बनाए रख सकता हूं? Fragment#onCreate, Fragment#onActivityCreated, आदि पर बंडल हमेशा null है।

इसलिए, मैं बैक स्टैक पुनर्स्थापना के लिए एक नए नए खंड लॉन्च से कोई फर्क नहीं पड़ता।

नोट: संभव related/duplicate question

+0

अभी मेरे पास एकमात्र विकल्प है: 'isFromBackStack = getActivity()। GetSupportFragmentManager()। GetBackStackEntryCount()> 0'। मुझे कुछ क्लीनर चाहिए, यह मुझे एक हैक की तरह लगता है। इसके अलावा, मुझे पिछले खंड उदाहरण से 'बंडल' नहीं मिलता है। –

उत्तर

8

यह सही नहीं लगता है, लेकिन यहाँ मैं कैसे कर समाप्त हो गया है:

public class MyActivity extends FragmentActivity { 
    private Bundle mMainFragmentArgs; 

    public void saveMainFragmentState(Bundle args) { 
     mMainFragmentArgs = args; 
    } 

    public Bundle getSavedMainFragmentState() { 
     return mMainFragmentArgs; 
    } 

    // ... 
} 

और मुख्य टुकड़ा में:

public class MainFragment extends Fragment { 
    @Override 
    public void onActivityCreated(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Bundle args = ((MyActivity) getActivity()).getSavedMainFragmentState(); 

     if (args != null) { 
      // Restore from backstack 
     } else if (savedInstanceState != null) { 
      // Restore from saved instance state 
     } else { 
      // Create from fragment arguments 
      args = getArguments(); 
     } 

     // ... 
    } 

    // ... 

    @Override 
    public void onDestroyView() { 
     super.onDestroyView(); 
     Bundle args = new Bundle(); 
     saveInstance(args); 
     ((MyActivity) getActivity()).saveMainFragmentState(args); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     saveInstance(outState); 
    } 

    private void saveInstance(Bundle data) { 
     // put data into bundle 
    } 
} 

यह काम करता है!

  • वापस backstack से अगर, टुकड़ा onDestroyView
  • वापस एक और एप्लिकेशन/प्रक्रिया से अगर
  • में सहेजा पैरामीटर का उपयोग करता/स्मृति से बाहर है, टुकड़ा onSaveInstanceState
  • से पुनर्स्थापित किया जाता है, तो पहली बार के लिए बनाया , खंड setArguments

सभी घटनाओं को कवर किया गया है, और सबसे ताज़ी जानकारी हमेशा रखी जाती है।

यह वास्तव में अधिक जटिल है, यह interface आधारित है, श्रोता onAttach/onDetach से अन/पंजीकृत है। लेकिन सिद्धांत एक ही हैं।

+0

वाह। मैं सिर्फ एंड्रॉइड सीख रहा हूं इसलिए मुझे संदेह है कि मुझे कुछ याद आ रहा है। शायद मुझे एक किताब पढ़नी चाहिए। मैं अपने टुकड़े पर जीवन काल में बने रहने के लिए डेटा नहीं प्राप्त कर सका। लेकिन यह चाल है। धन्यवाद – terary

+1

बैकस्टैक मामले के लिए ऑनस्ट्रायव्यू में राज्य को सहेजने के बजाय आप FragmentManager की saveFragmentInstanceState() को इसे हटाने/बदलने से पहले इसका उपयोग कर सकते हैं। यह SaveInstanceState() पर कॉल करेगा। यह आपको एक बार में राज्य दृढ़ता कोड रखने की अनुमति देता है। –

+0

मेरे पास इस तरह का एक समान दृष्टिकोण है जहां मुझे उस सूची को सहेजने की ज़रूरत है जो पहले 'लोड' की जगह ले ली गई थी। क्या आपको पता है कि इससे कोई स्मृति समस्या हो सकती है? – jlively

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