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
Ответы
Ответ 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())
Надеюсь, это вам поможет:)