Подтвердить что ты не робот

FragmentPagerAdapter getItem не запускается

В настоящее время с FragmentActivity я переключаюсь между двумя типами фрагментов, используя следующий код.

private void toggle() {
    Fragment oldFragment = getSupportFragmentManager().findFragmentById(R.id.content);
    Fragment fragment = null;
    if (oldFragment instanceof ColorFragment) {
        fragment = new ViewPagerFragment();
    } else {
        fragment = new ColorFragment(android.R.color.black);
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();
}

2 Фрагменты переключаются.

  • ColorFragment. Простой фрагмент, который заполняет его фон сплошным черным цветом.
  • ViewPagerFragment - фрагмент содержит ViewPager. Пользователь может прокручивать между фиолетовым фрагментом цвета и фрагментом синего цвета.

Код, который отвечает за прокрутку фиолетовых и синих цветовых фрагментов, приведен ниже.

private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

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

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

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new ColorFragment(android.R.color.holo_purple);
        default:
            return new ColorFragment(android.R.color.holo_blue_bright);
        }
    }      
} 

Тем не менее, я сталкиваюсь с странным поведением при переключении.

  • Был показан фрагмент черного цвета.
  • Переключение.
  • Просмотр пейджера, который можно прокручивать между фиолетовыми и синими фрагментами.
  • Переключение.
  • Был показан фрагмент черного цвета.
  • Переключение.
  • Ничего не отображается, поскольку MyFragmentPagerAdapter getItem не запускается.

Я думаю, что моя ситуация похожа на FragmentPagerAdapter getItem не вызывается

Однако я предпочитаю не использовать FragmentStatePagerAdapter из-за стоимости потенциально большего количества накладных расходов при переключении между страницами.

Любое обходное решение для решения этой проблемы?

Я включаю полный работоспособный исходный код для демонстрации этой проблемы: https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip

4b9b3361

Ответ 1

Любое обходное решение для решения этой проблемы?

Я загрузил ваш код, и проблема возникла из-за того, что вы не используете эти Fragments права. Наиболее точно вы используете вложенный Fragments в ViewPager на основе Fragment и для этого ViewPager вы создаете адаптер следующим образом:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());

Вместо этого вы должны использовать getChildFragmentManager() для связывания вложенных фрагментов:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

Кроме того, вы не должны передавать данные через конструктор в Fragment, так как данные не перейдут на изменение конфигурации, и начнут появляться плохие вещи. Вместо этого используйте Bundle.

Ответ 2

Глобальное рабочее тестируемое решение.

getSupportFragmentManager() несколько раз хранит нулевую ссылку, а пейджер View не создает новый экземпляр фрагмента. Поскольку он находит ссылку на тот же фрагмент. Таким образом, использование getChildFragmentManager() позволяет решить проблему простым способом.

Не

new PagerAdapter(getSupportFragmentManager(), fragments);

Do

new PagerAdapter(getChildFragmentManager() , fragments);

Ответ 3

В моем случае я правильно звонил

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

но затем во вложенном фрагменте я пытался заменить фрагмент контейнера другим, используя:

getFragmentManager()

Вам нужно перейти к активности и вызвать

getActivity().getSupportFragmentManager();

Ответ 4

В моих случаях он работал после добавления этого в мой FragmentPagerAdapter:

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

и я также использовал getChildFragmentManager(), как сказал Luksprog

Ответ 5

Простое использование FragmentStatePagerAdapter вместо FragmentPagerAdapter

или

вы можете использовать new MyFragmentPagerAdapter(this.getChildFragmentManager())

Надеюсь, это вам поможет:)