Я хочу понять это исключение, чтобы реализовать правильное исправление.
Существует ViewPager, и он использует FragmentStatePagerAdapter для создания экземпляров 2 фрагментов через getItem и MyFragmentClass.newInstance(...)
.
getItem адаптера выглядит так:
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch(position) {
case 0:
fragment = MyFragment2.newInstance(par1);
break;
case 1:
fragment = MyFragment2.newInstance(par2, par3);
break;
}
return fragment;
}
Проблема:
Когда действие уничтожается и создается снова, адаптер снова создается, фрагменты снова создаются с помощью MyFragmentClass.newInstance(...)
... но затем в этой строке:
pager.setAdapter(adapter);
Я получаю упомянутое исключение.
Я посмотрел в источнике, где выбрасывается исключение, это:
@Override
public Fragment getFragment(Bundle bundle, String key) {
int index = bundle.getInt(key, -1);
if (index == -1) {
return null;
}
if (index >= mActive.size()) {
throw new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index);
}
Fragment f = mActive.get(index);
if (f == null) {
throw new IllegalStateException("Fragement no longer exists for key "
+ key + ": index " + index);
}
return f;
}
Таким образом, туда передается пакет с некоторым состоянием, которое ссылается на мои старые фрагменты, но это не соответствует текущему состоянию(mActive
), и выбрасывается исключение.
Я не понимаю, в чем идея этого или каким образом я должен создавать экземпляры фрагментов.
Я попробовал трюк, который я получил из другого контекста:
pager.setOffscreenPageLimit(1);
Во избежание уничтожения фрагментов, когда они находятся за пределами экрана (в случае 2-страничного просмотра, хотя не знаю, хорошо ли он работает с адаптером состояния ). Но, кажется, не связаны,по крайней мере, это не помогает, все равно получаю то же исключение.
Перехват исключения приводит к тому, что страницы остаются пустыми.