Проблема с перестановкой replace() фрагментов в Android

Рейтинг: 1Ответов: 1Опубликовано: 21.02.2015

Привет.

Пишу приложение на Android, в котором через меню заменяю один фрагмент на другой функцией replace(). Все было хорошо, пока в одном из фрагментов не стал использовать ViewPager, который содержит другие фрагменты. При первом вызове replace() все хорошо, а при последующих некоторые фрагменты в ViewPager пропадают, а некоторые появляются при пролистывании, а точнее, не для всех фрагментов в ViewPager выполняется getItem().

В чем может быть проблема?

public class GunStats extends Fragment {

    public GunStats() {
    }

    private ViewPager viewPager;
    private SlidingTabLayout mTab;

    private static Fragment fr1, fr2, fr3;

    static {
        fr1 = GunStats1.getFragment();
        fr2 = GunStats1.getFragment();
        fr3 = GunStats1.getFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.sliding_tabs, container, false);
        viewPager = (ViewPager) view.findViewById(R.id.viewpager);
        viewPager.setAdapter(new MyFragmentPagerAdapter(getActivity().getSupportFragmentManager()));
        mTab = (SlidingTabLayout) view.findViewById(R.id.tabs);
        mTab.setViewPager(viewPager);

        return view;
    }

    private class MyFragmentPagerAdapter extends FragmentPagerAdapter {

        private String[] tabText = getResources().getStringArray(R.array.tabs_text);

        public MyFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
            Log.d("TAG", "Constructor");
        }

        @Override
        public Fragment getItem(int position) {
            Log.d("TAG", "getItem");
            switch (position) {
                case 0: return fr1;
                case 1: return fr2;
                case 2: return fr3;
            }
            return null;
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            return tabText[position];
        }
    }
}

Ответы

▲ 2Принят

Вместо getActivity().getSupportFragmentManager() используйте getChildFragmentManager()

Попробуйте ещё не держать фрагменты в статике, а каждый раз создавать новые в getItem(int position)