2013-01-04 15 views
5

के साथ टैब बदलने पर फ्रैगमेंट फिर से बनाया गया है मुझे 4 टैब के साथ ViewPager मिला है।ViewPager

मैं एक कस्टम एडाप्टर का उपयोग कर रहा हूं जो FragmentPagerAdapter फैलाता है।

समस्या यह है कि जब मैं टैब बदलता हूं, तो पहले Fragment फिर से बनाया जाता है हालांकि यह वर्तमान में दिखाई नहीं दे रहा है। इसके अलावा, यह चौथे बार टैब बदलने के बाद ही होता है। जैसे टैब 1 -> टैब 2 -> टैब 3 =>onStop टैब 1 से कहा जाता है। -> टैब 1 =>onCreateView टैब 1 से कहा जाता है (onAttach नहीं कहा जाता है)।

मैं इससे बचना चाहता हूं। मुझे अपने टैब में हमेशा रहने के लिए सभी टैब की आवश्यकता होती है, भले ही वे वर्तमान में प्रदर्शित न हों। मैं यह कैसे कर सकता हूं?

उत्तर

20

ViewPager से विधि setOffscreenPageLimit() का उपयोग करना जितना आसान हो गया है।

और जानकारी: http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

+0

धन्यवाद महोदया, मैंने अंत में अपना कोड बना दिया! मैं सहेजा गया उदाहरण प्राप्त करने के लिए देख रहा था, लेकिन यह 1 LOC ने अपना कोड काम किया xD –

+0

सरल और धन्यवाद! – neobie

+0

धन्यवाद। इसने मेरी समस्या का हल किया –

0

जब आप खंड को तुरंत चालू करते हैं, तो setRetainInstance(true) पर कॉल करें। यह टुकड़े की आवृत्ति स्थिति बनाए रखेगा। onCreateView अभी भी कॉल किया जाएगा और आपको यह सुनिश्चित करने की आवश्यकता होगी कि आप सहेजे गए राज्य का उपयोग कर लें और फिर किसी भी डेटा को लोड किए बिना दृश्य प्रस्तुत करें, उदा। boolean का उपयोग करके यह प्रतिनिधित्व करने के लिए कि आपका टुकड़ा पहले से ही शुरू हो चुका है या नहीं।

public static class MyAdapter extends FragmentPagerAdapter { 
     @Override 
     public Fragment getItem(int position) { 
       MyFragment myFragment = new MyFragment(); 
       myFragment.setRetainInstance(true); 
       return myFragment; 
     } 
} 

class MyFragment extends Fragment { 
     . 
     . 
     . 

     boolean initialized = false; 
     ArrayList<MyData> myData = null; 

     void onCreate(...) { 
       if (initialized) { 
         renderViews(); 
       } else { 
         initialized = true; 
         loadData(); 
         renderViews(); 
       } 
     } 
} 

आप onSaveInstanceState() लागू करने की आवश्यकता नहीं है:

आप कुछ इस तरह करना होगा। इसे स्वचालित रूप से संभाला जाएगा।

+0

मैं इस व्यवहार .. समझ में नहीं आता क्यों यह stoped होने के बाद फिर से बनाई गई है, तो यह और भी एक से प्रदर्शित नहीं किया है? फिर भी, मैं आपके दृष्टिकोण का पालन करने की कोशिश कर रहा हूं, लेकिन मैं यह नहीं समझ सकता कि राज्य को कैसे बचाया जाए। मैंने 'Fragment' से' onCreateView() 'में 'setRetainInstance (true)' जोड़ा है लेकिन 'ऑनसेवेंसस्टेट()' को कभी भी नहीं कहा जाता है। – sergi

+0

इसे दोबारा कहा जाता है क्योंकि यह बाईं ओर और वर्तमान दृश्य के दाईं ओर एक टुकड़ा बनाता है ताकि वह इसे स्लाइडिंग एनीमेशन के साथ प्रदर्शित कर सके। अधिक जानकारी के लिए मेरा संपादन देखें। –

+0

अब यह अधिक स्पष्ट है, लेकिन मैं 'ऑनक्रेट()' में विचारों के साथ कुछ भी नहीं करता हूं, लेकिन 'ऑनक्रेट व्यू()' में 'जिसे' व्यू 'वापस करने की आवश्यकता है जिसे पिछले राज्य से मिलान करने के लिए संशोधित करना होगा। असल में, जब मैं 'myFragment.setRetainInstance (true) का उपयोग करता हूं,' 'पहले क्रिएटिव व्यू()' या 'ऑनक्रेट()' को पहले नहीं कहा जाता था। – sergi