Я хочу понять это исключение, чтобы осуществить правильное исправление.
Есть 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
), и mActive
исключение.
Я не понимаю, в чем суть этой идеи или каким образом я должен создавать фрагменты.
Я попробовал трюк, полученный из другого контекста:
pager.setOffscreenPageLimit(1);
Во избежание того, что фрагменты уничтожаются, когда они находятся за пределами экрана (в случае 2-страничного видового пейджера, хотя не знаю, хорошо ли он работает с адаптером состояния). Но, похоже, это не связано, по крайней мере, это не помогает, но все равно получаю то же исключение.
Перехват исключения приводит к тому, что страницы остаются пустыми.