11

दिखाई नहीं दे रहा है मुझे एक ViewPager + FragmentPageAdapter के साथ कोई समस्या है।व्यूपेजर टुकड़े मनोरंजन, फिर से शुरू हो गए हैं लेकिन

परिदृश्य: मैं एक टुकड़ा ए टुकड़ा एक टुकड़ा बी 1 ई टुकड़ा बी 2 के साथ एक ViewPager है अंदर के साथ एक गतिविधि है। बी 1 ई बी 2 एक ही कक्षा है, लेकिन विभिन्न डेटा तर्क के रूप में हैं।

समस्या: सब कुछ निर्माण समय पर अच्छी तरह से काम करता है। लेकिन जब ऐप पृष्ठभूमि में जाता है और एंड्रॉइड द्वारा प्रक्रिया को मार दिया जाता है, तो अंतिम स्थिति को पुनर्स्थापित करने की कोशिश कर रहा है, ऐप को दोबारा डालने की कोशिश कर रहा है, फ्रैगमेंट बी 1 ई बी 2 अग्रभूमि में दिखाई नहीं दे रहा है, जबकि फ्रैगमेंट ए है। थोड़ा अजीब लगता है कि फ्रैगमेंट बी 1 ई बी 2 फ्रैगमेंट ए के चाइल्डफ्रैगमेंट मैनेजर में हैं और फिर से शुरू हो गए हैं क्योंकि ऑनस्टार्ट() और ऑनस्यूम() को लॉग द्वारा देखा जाता है। इसके अलावा पेजर दो पृष्ठों के साथ फिर से शुरू हो गया है, लेकिन कुछ भी दिखाई देने के साथ खाली या बेहतर है।

अगर मैं अच्छी तरह से समझता हूं कि FragmentPagerAdapter कैसे काम करता है, तो इसकी ज़िम्मेदारी अपने स्वयं के टुकड़ों का प्रबंधन करना चाहिए और उन्हें कैसे बनाया जाना चाहिए। इसके अलावा इस बिंदु को लागू करने के लिए, FragmentPagerAdapter पृष्ठभूमि से वापस आने पर getItem (int स्थिति) को कॉल नहीं करता है यदि पहले से निर्दिष्ट स्थिति के साथ उस स्थिति में एक टुकड़ा मौजूद है।

... तो मैं फ्रैगमेंट बी 1 ई बी 2 क्यों नहीं देख सकता, लेकिन केवल पेजर खाली है?

यह मेरा नमूना कोड है।

FragmentA

@Override 
    public void onStart() { 
     super.onStart(); 
     populateViewPager(); 
    } 

    private void populateViewPager() { 
     pager.setAdapter(new MyFragmentPageAdapter(getChildFragmentManager())); 
     indicator.setViewPager(pager); 
     indicator.notifyDataSetChanged(); 
    } 

FragmentPagerAdapter

public class MyFragmentPageAdapter extends FragmentPagerAdapter { 


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

    @Override 
    public Fragment getItem(int position) { 
     return FragmentB.newInstance(position); 
    } 

    @Override 
    public int getCount() { 
     return 2; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     String title = ""; 
     if (position == 0) 
      title = "Fragment B1"; 
     else if (position == 1) 
      title = "Fragment B2"; 

     return title; 
    } 
} 

टुकड़ा बी

 public static FragmentB newInstance(int position) { 
       FragmentB f = new FragmentB(); 
       Bundle b = new Bundle(); 
       b.putInt(POSITION_IN_PAGER_ARGUMENT, position); 
       f.setArguments(b); 
       return f; 
      } 

      @Override 
      public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       Log.d(TAG, "onCreate"); 
      } 

      @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
       super.onCreateView(inflater, container, savedInstanceState); 
       Log.d(TAG, "onCreateView"); 
       View root = inflater.inflate(R.layout.fragment_b_layout, container, false); 

       empty = (TextView) root.findViewById(R.id.empty); 
       list = (ListView) root.findViewById(R.id.list); 

       return root; 
      } 

      @Override 
      public void onStart() { 
       super.onStart(); 
       Log.d(TAG, "onStart"); 
       populateListView(loadData()); 

      } 

      @Override 
      public void onStop() { 
       super.onStop(); 
      } 
    } 
+0

कोई मदद? कृप्या। – Noodles

+0

आपका FragmentPagerAdapter बहुत खाली लगता है è.è –

+0

क्या आपको इसका कोई समाधान मिला? थोड़ी देर के लिए एक ही समस्या के साथ अटक गया है। – Slickelito

उत्तर

0

यहाँ मेरी PagerD है टैब के साथ अनुकूलक शायद यह आप एक छोटे से मदद कर सकते हैं: FragmentPagerAdapter के बजाय

public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener { 
     private final Context    mContext; 
     private final ActionBar    mActionBar; 
     private final ViewPager    mViewPager; 
     private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

     static final class TabInfo { 
      private final Class<?> clss; 
      private final Bundle args; 

      TabInfo(Class<?> _class, Bundle _args) { 

       clss = _class; 
       args = _args; 
      } 
     } 

     public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { 

      super(activity.getSupportFragmentManager()); 
      mContext = activity; 
      mActionBar = activity.getSupportActionBar(); 
      mViewPager = pager; 
      mViewPager.setAdapter(this); 
      mViewPager.setOnPageChangeListener(this); 
     } 

     /** 
     * methode qui construit un onglet 
     * 
     * @param tab 
     * @param clss 
     * @param args 
     */ 
     public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { 

      TabInfo info = new TabInfo(clss, args); 
      tab.setTag(info); 
      tab.setTabListener(this); 
      mTabs.add(info); 
      mActionBar.addTab(tab); 
      notifyDataSetChanged(); 
     } 

     @Override 
     public int getCount() { 

      return mTabs.size(); 
     } 

     @Override 
     public Fragment getItem(int position) { 

      TabInfo info = mTabs.get(position); 
      return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
     } 

     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

     } 

     public void onPageSelected(int position) { 

      mActionBar.setSelectedNavigationItem(position); 
      ((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu(); 
     } 

     public void onPageScrollStateChanged(int state) { 

     } 

     public void onTabSelected(Tab tab, FragmentTransaction ft) { 

      // 
      // force l'appel de onOptionMenuPrepared 
      ((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu(); 
      Object tag = tab.getTag(); 
      for (int i = 0; i < mTabs.size(); i++) { 
       if (mTabs.get(i) == tag) { 
        mViewPager.setCurrentItem(i); 
       } 
      } 
     } 

     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 

     } 

     public void onTabReselected(Tab tab, FragmentTransaction ft) { 

     } 
    } 
7

उपयोग FragmentStatePagerAdapter। यह मेरे लिए काम किया। लेकिन अगर आपके व्यूपेजर को प्रदर्शित करने के लिए बहुत सारे विचार हैं तो स्मृति समस्याएं होंगी (केवल स्क्रीन अभिविन्यास परिवर्तन के दौरान)।

+0

स्मृति समस्या क्यों? – Noodles

+0

क्योंकि जीवन चक्र फिर से शुरू होने के बाद से विचारों को पुनर्निर्माण करना है। – user2886615

+0

निराशा के दिनों के बाद, यह मेरे लिए स्वीकार्य समाधान है। स्वीकार्य उत्तर के रूप में। – bajicdusko

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