8

У меня есть Fragment MyFragment vith a ViewPager, содержащий больше Fragment. Он работает правильно при первом загрузке MyFragment, но если я вернусь и заново создаю его, то Fragments в ViewPager не будут показаны, потому что метод FragmentPagerAdapter.getItem не вызывается.Фрагменты в ViewPager не загружаются при восстановлении содержащего фрагмента

Я использую

Что случилось?

import android.app.Fragment; 
import android.app.FragmentManager; 
import android.support.v13.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
... 

public class MyFragment extends Fragment { 

    private ViewPager pager; 
    private MyPagerAdapter adapter; 

    private List<Fragment> fragmentList = new ArrayList<Fragment>(); 

    public MyFragment() {} 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.my_fragment_layout, container, false); 
    } 

    public void onViewCreated(View v, Bundle savedInstanceState) { 
     super.onViewCreated(v, savedInstanceState); 

     indicators = (PagerSlidingIndicator) v.findViewById(R.id.indicators); 
     pager = (ViewPager) v.findViewById(R.id.pager); 

     Fragment fragment1 = new Fragment1(); 
     fragmentList.add(fragment1); 

     Fragment fragment2 = new Fragment2(); 
     fragmentList.add(fragment2); 

     Fragment fragment3 = new Fragment3(); 
     fragmentList.add(fragment3); 

     adapter = new IndicatorPagerAdapter(getFragmentManager()); 
     pager.setAdapter(adapter); 
    } 

    public class MyPagerAdapter extends FragmentPagerAdapter { 

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

     @Override 
     public int getCount() { 
      return fragmentList.size(); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return fragmentList.get(position); 
     } 
    } 
} 

ответ

22

Если вы используете вложенные фрагменты («У меня есть фрагмент MyFragment Вит ViewPager, содержащий больше фрагмента»), вам нужно использовать getChildFragmentManager(), не getFragmentManager(), при настройке FragmentPagerAdapter.

+0

getChildFragmentManager(): для вызова требуется уровень API 17, и у меня есть min = 15. Таким образом, единственный способ использовать поддержку «Фрагмент», правильно? – jul

+0

Да, печальная правда заключается в том, что мне пришлось заменить все мои фрагменты поддержкой Фрагмента, чтобы иметь возможность использовать getChildFragmentManager() – jul

+0

@jul: Да, понятие вложенных фрагментов было добавлено только к нативной реализации фрагментов в API Level 17 Ваши альтернативы были бы либо не иметь «ViewPager» в фрагменте, либо не иметь фрагментов в качестве страниц «ViewPager». – CommonsWare

 Смежные вопросы

  • Нет связанных вопросов^_^