2011-11-27 21 views
5

मैंने देखा की मनोरंजन से बचने कि जब एक FragmentPagerAdapter टुकड़े है कि वर्तमान एक अपने विचार को नष्ट कर दिया (और उनके onPause() और onStop() तरीकों कहा जाता है, और अजीब onSaveInstanceState(Bundle) किया जा रहा है कर रहे हैं करने के लिए गैर निकट हैं का उपयोग कर कहा जाता है), और onCreateView इन टुकड़ों के लिए फिर से बुलाया जा रहा है। मेरी समस्या यह है कि मेरे पास कुछ Timer एस इन टुकड़ों पर चल रहा है, और उन्हें पुनर्निर्माण करना व्यवहार्य नहीं है क्योंकि इन टाइमर को प्रासंगिक खंड UI को आग और अद्यतन करना चाहिए। बड़ी स्क्रीन के लिए मैंने LinearLayout के साथ उपयोग किया और यह बेकार ढंग से काम करता है।FragmentPagerAdapter - टुकड़े के विचारों

मेरे गतिविधि में प्रासंगिक कोड:

private class MyPagerAdapter extends FragmentPagerAdapter implements TitleProvider { 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     if (position == 0) { 
      return mAddNewScenesFragment; 
     } else if (position == 1) { 
      return mGlobalEventsFragment; 
     } else { 
      return mSceneFragments.get(position - 2); 
     } 
    } 

    @Override 
    public int getCount() { 
     return mSceneFragments.size() + 2; 
    } 

    @Override 
    public String getTitle(int position) { 
     if (position == 0) { 
      return "New scene"; 
     } else if (position == 1) { 
      return mGlobalEventsFragment.getTitle(); 
     } else { 
      return mSceneFragments.get(position - 2).getTitle(); 
     } 
    } 
} 

टुकड़े गतिविधि के onCreate पद्धति पर बनाई गई हैं और अन्य लोगों के क्रम में सूची में जोड़ा जा सकता है, लेकिन फिर भी कोई नया जोड़ने के बिना, तीसरे टुकड़ा नष्ट हो जाता है जब मैं पहली बार स्क्रॉल करता हूं।

क्या उनके विनाश से बचने के लिए कोई तरीका है या क्या मुझे बस ViewPager भूल जाना चाहिए और छोटी स्क्रीन के लिए HorizontalScrollView का उपयोग करना चाहिए? मैं इसका उपयोग करना चुनता हूं क्योंकि मुझे लगता है कि "निश्चित" व्यवहार वास्तव में उपयोगिता के साथ मदद करता है।

उत्तर

16

निम्न विधि को नष्ट करने से टुकड़े को रोकने चाहिए:

mViewPager.setOffscreenPageLimit(no_of_fragments_to_be_kept_offscreen); 
+4

यह mFragmentPagerAdapter.setOffscreenPageLimit() नहीं है। यह mViewPager.setOffscreenPageLimit (संख्याऑफफ्रेगमेंट्स) है। मैं आश्चर्यचकित हूं कि बहुत सारी गलती हुई है। –

+0

आप सही @raychenon हैं। मैंने अपना जवाब अपडेट कर लिया है। – Saimon

+0

हां, यह मेरी समस्या हल हो गया .. धन्यवाद @ सैमॉन – bebosh

0

आप FragmentStatePagerAdapter बजाय FragmentPagerAdapter से विस्तार करना चाहिए। क्रिएट (बंडल सेव किया गया इंस्टेंसस्टेट) पर विधि को दूसरी बार नहीं कहा जाना चाहिए।

0

आपको नष्ट करने से बचने के लिए पेजर को सीमा निर्धारित करने की आवश्यकता है।

your_pager_obj.setOffscreenPageLimit(no_of_fragments_on_each_side_of_the_current_fragment); 
6
इसके बजाय FragmentPagerAdapter हैकिंग के

, बस ViewPager का उपयोग करें।

int limit = myPagerAdapter.getCount(); 
// Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state. 
viewpager.setOffscreenPageLimit(limit); 
संबंधित मुद्दे