java.lang.IllegalStateException :Фрагмент больше не существует для ключа f1 :индекс 3

Я хочу понять это исключение, чтобы реализовать правильное исправление.

Существует 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-страничного просмотра, хотя не знаю, хорошо ли он работает с адаптером состояния ). Но, кажется, не связаны,по крайней мере, это не помогает, все равно получаю то же исключение.

Перехват исключения приводит к тому, что страницы остаются пустыми.

46
задан Ixx 22 April 2019 в 15:54
поделиться