Android FragmentStatePagerAdapter возвращает пустой экран при перезагрузке средних фрагментов

Я пытаюсь создать приложение с 4 вкладками, используя FragmentStatePagerAdapter и ViewPager.

Когда я впервые запускаю приложение и если я выбираю вкладки по порядку (от 0 до 3), все идет нормально, затем, если я пытаюсь выполнить обратный путь (от 3 до 0), вкладка 1 показывает пустой экран, если после этого я выберите вкладку 2, затем также будет пусто, если я перейду на вкладку 0 и снова проделаю путь, вкладка 2 вернется к жизни, а несколько раз вкладка 1 вернется к жизни, но я не нашел никакой последовательности ...

Я знаю, что это беспорядок ... Дело в том, что вкладка 1 используется для сбоя, вкладка 2 несколько раз терпит неудачу, а вкладки 0 и 3 всегда работают нормально. Если я поменяю положение фрагментов, все будет одинаково, некоторые, я думаю, не связаны с кодом фрагментов...

Ошибок в логкате нет, отладка фрагментов показывает, что все идет как надо...

Я несколько дней пытался это исправить, но безуспешно (очевидно...), я пытался переопределить getItemPosition(), чтобы вернуть POSITION_NONE, я попытался сделать свой собственный FragmentStatePagerAdapter, как здесь, скажем http://speakman.net.nz/blog/2014/02/20/a-bug-in-and-a-fix-for-the-way-fragmentstatepageradapter-handles-fragment-restoration/ но ничего... И еще некоторые вещи, которые не работали для меня.

Немного кода: Основной класс

 public class Main extends FragmentActivity implements ActionBar.TabListener {
        private MyPageAdapter mPagerAdapter;
        private ViewPager mPager;

    @Override
    protected void onCreate(Bundle si) {
        super.onCreate(si);
        setContentView(R.layout.activity_main);
        init();
    }

        private void init() {
        final ActionBar actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        if (mPagerAdapter == null) {

            mPagerAdapter = new PaginaAdapter(getSupportFragmentManager());

            mPager = (ViewPager) findViewById(R.id.pager);
            mPager.setAdapter(mPagerAdapter);
            mPager.requestTransparentRegion(mPager);


            mPager.setOnPageChangeListener(new viewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });

            // Tab creation
            for (int i = 0; i < mPagerAdapter.getCount(); i++) {
                View tabView = getLayoutInflater().inflate(R.layout.tab, null);
                ((ImageView) tabView.findViewById(R.id.tabIcon))
                .setImageDrawable(getResources().getDrawable(mPagerAdapter.getIcon(i)));

                           actionBar.addTab(actionBar.newTab().setCustomView(tabView).setTabListener(this));
            }

        }

    }

        @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {

    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {

    }

Адаптер

public class MyPageAdapter extends FragmentStatePagerAdapter {
     public MyPageAdapter(FragmentManager fm) {
          super(fm);
     }

     @Override
     public Fragment getItem(int position) {

        Fragment fragment = null;

        switch (position) {
        case 0:
            fragment = new InitFragment();
            break;
        case 1:
            fragment = new MusicFragment();
            break;
        case 2:
            fragment = new VideoFragment();
            break;
        case 3:
            fragment = new PicFragment();
            break;
        }

        return fragment;
     }

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

....

}

Спасибо.

ОБНОВЛЕНИЕ: Мои фрагменты находятся в отдельных классах и не статичны, это важно? Еще одна вещь, которую я только что понял, это то, что кажется, что фрагмент уничтожается после того, как я коснусь вкладки, потому что, если я медленно прокручиваю, я вижу фрагмент, но внезапно все исчезает.


person josecash    schedule 27.05.2014    source источник
comment
как решить эту проблему, пожалуйста, обновите.   -  person Harish    schedule 12.10.2015


Ответы (2)


Я бы посоветовал вам использовать FragmentPagerAdapter вместо FragmentStatePagerAdapter. Кажется, вы хотите иметь только 3 Tabs и Fragment для каждого, что не звучит слишком интенсивно для памяти (пока они не заполнены Bitmaps и т. д.). При использовании FragmentStatePagerAdapter вы несете ответственность за восстановление состояния каждого Fragment при его повторной загрузке, с FragmentPagerAdapter система сохраняет иерархию View, что вам и нужно.

person Emmanuel    schedule 27.05.2014

Попробуйте это использовать FragmentPagerAdapter

MyPageAdapter .java

public class MyPageAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int index) {

         switch (position) {
    case 0:
        fragment = new InitFragment();
        break;
    case 1:
        fragment = new MusicFragment();
        break;
    case 2:
        fragment = new VideoFragment();
        break;
    case 3:
        fragment = new PicFragment();
        break;
    }


        return null;
    }

    @Override
    public int getCount() {
        // get item count - equal to number of tabs
        return 4;
    }

}
person Vivek Elangovan    schedule 27.05.2014