11

Bir ViewPager + FragmentPageAdapter ile ilgili bir sorunum var.ViewPager parçaları yeniden oluşturuluyor, ancak görünür değil

Senaryo: I Fragman bir kesit B1 e Fragman B2 ile ViewPager sahip bir Parça A içinde olan bir etkisine sahiptir. B1 e B2 aynı sınıftır, ancak argüman olarak farklı verilerdir.

Sorun: Her şey iyi oluşturma zamanında çalışır. Fakat uygulama arka planda kaldığında ve işlem android tarafından öldürüldüğünde, son durumu geri yüklemeye çalışarak, uygulamayı tekrar başlatırken, Fragman A ise, B1 e B2 Parçası ön planda görünmez. Biraz garip görünen, Fragman B1 e B2'nin Fragman A ChildFragmentManager'ına ait olması ve onStart() ve onResume() 'ın çağrılması (Log tarafından görülmesi) nedeniyle devam ettirilmesidir. Ayrıca, çağrı cihazı iki sayfa ile devam eder, ancak boş ya da daha iyi hiçbir şey görünmez.

FragmentPagerAdapter'in nasıl çalıştığını iyi anlarsam, kendi parçaları ve bunların nasıl yeniden oluşturulması gerektiği kendi sorumluluğunu üstlenmelidir. Ayrıca, bu noktayı uygulamak için, FragmentPagerAdapter, belirtilen konumdaki bir parça zaten mevcutsa arka plandan geldiğinde getItem (int position) öğesini çağırmaz.

... Öyleyse neden Fragman B1 e B2'yi göremiyorum, fakat sadece Çağrı Cihazı boş mu?

Bu örnek kodum.

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; 
    } 
} 

Fragman B İşte

 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

herhangi bir yardım? Lütfen. – Noodles

+0

FragmentPagerAdapter'iniz boş görünüyor è.è –

+0

Bunun için herhangi bir çözüm buldunuz mu? Bir süredir aynı problemle sıkışmış. – Slickelito

cevap

0

benim PagerD olduğunu sekmeleri ile adaptör belki seni biraz yardımcı olabilir: yerine FragmentPagerAdapter ait

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

kullanım FragmentStatePagerAdapter. Benim için çalıştı. Ancak ViewPager'ınızın görüntülenmesi için çok sayıda görünümü varsa, bellek sorunları (yalnızca ekran yönünü değiştirirken) olacaktır.

+0

neden bellek sorunu? – Noodles

+0

çünkü yaşam döngüsü yeniden başından beri görüntülerin yeniden oluşturulması gerekiyor – user2886615

+0

Günlerce hayal kırıklığı yaşadım, bu benim için kabul edilebilir bir çözüm. kabul edildi Yanıt – bajicdusko

İlgili konular