Intereting Posts
Как отформатировать номер телефона с помощью PhoneNumberUtils? Как сделать HTTP-запрос с помощью файлов cookie на Android? В чем разница между этим и Activity.this Как использовать пример onSavedInstanceState пожалуйста Разрешить поворот / пейзаж в одном фрагменте R.raw.any ничего нельзя разрешить Android Studio: как удалить APK (или выполнить команду adb) автоматически до запуска или отладки? RadioGroup вызывает onCheckChanged () три раза RadioGroup с двумя колонками, в которых есть десять RadioButtons Может ли GridView иметь нижний колонтитул и заголовок так же, как ListView? Android: загружено изображение Picasso. Как показать сообщение об ошибке Попытка вручную подписать пакет android с помощью jarsigner.exe и установить с помощью adb.exe Как предоставить файлы данных для тестов на андроид Зачем использовать библиотеку Android Picasso для загрузки изображений? Получение «отлаживаемого» значения androidManifest из кода?

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

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

Обзор:

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

То, что я сделал прямо сейчас, это поставить блок catch try вокруг строки, и ну, тогда я получаю пустые страницы вместо аварийного окна, также не очень хорошо.

Solutions Collecting From Web of "Java.lang.IllegalStateException: Фрагмент больше не существует для ключа f1: index 3"

Это может помочь –

 @Override public Parcelable saveState() { return null; } 

Добавьте строку выше в FragmentStatePagerAdapter .

Если вы не хотите, чтобы фрагменты были восстановлены, когда они вне экрана, вы должны использовать FragmentPagerAdapter а не FragmentStatePagerAdapter .

У меня есть борьба за эту проблему целый день, но теперь я нашел решение.

 private ViewPager _mViewPager; _mViewPager.setOffscreenPageLimit(5); //5 is how much page you have. 

setOffscreenPageLimit Устанавливает количество страниц, которые должны быть сохранены в обе стороны текущей страницы в иерархии представлений в состоянии ожидания. Страницы, выходящие за этот предел, будут воссозданы с адаптера, если это необходимо.

отлично ! Так как это repeat pager.setAdapter(adapter); При вызове restoreState вызывают исключение:

 Fragment no longer exists for key f0: index 0 

Мы можем выпускать фрагмент RootView

  public void onDestroyView() { super.onDestroyView(); if (isRecyclerRootViewAlways()) { mRootView = null;//<-- } mMyFragmentLifecycle.onFragmentDestroyView(this); }