Intereting Posts
Как выполнить тест, который проверяет надежность подключения к Интернету Цвет текста панели меню ActionBarSherlock Как поймать мягкую клавиатуру «введите / сделать» нажмите? Android Studio не запускается с подключенным устройством Веб-цвета в файле ресурсов xml xml SetMicrophoneMute (boolean) не работает на некоторых устройствах Фрагмент или фрагмент – Вложенные фрагменты против действий. Почему я должен использовать более одного действия? Получить идентификатор для просмотров, которые добавляются динамически Добавьте ListView или RecyclerView в новый NavigationView Как сделать представление заполнить пространство, доступное для него? На тестирование блока Android, когда использовать тестовые примеры? Запланировать повторную работу с помощью диспетчера работ Android – как предотвратить загрузку веб-страниц при отсутствии подключения к Интернету Экран Google Проведите половину страницы в ViewPager (из пакета совместимости)

Обработка и сглаживание IllegalStateException («состояние сохранения сбрасывания: активный $ Фрагмент очистил индекс: -1»)

Мое приложение Android управляет несколькими фрагментами. Однако я вижу большое количество сбоев в поле, содержащих эту строку журнала:

Java.lang.IllegalStateException: состояние сохранения отказа: активный XxxFragment {81e598 id = 0x7f0b0069 tag_yyy} очистил индекс: -1

Поиски ответов в Stack Overflow были бесплодны; Кажется, у меня много компаний, которые задаются вопросом, что именно это означает. Копаясь в трассировке исключений и в источниках Android, я вижу, что исключение происходит с того момента, когда моя основная активность сохраняет свое состояние (FragmentActivity.onSaveInstanceState), а отдельные фрагменты записываются в Parcelable. Каждый фрагмент имеет индекс (называемый mIndex), который должен быть неотрицательным, но из кода не совсем понятно, почему это должно быть так, поскольку mIndex больше никогда не используется в этой функции.

Я не знаю, как Фрагмент попадает в это состояние или что я могу с этим поделать. Я не смог воспроизвести ошибку в своей тестовой среде. Может ли кто-нибудь пролить свет на то, как избежать и / или справиться с этим исключением?

Связанные вопросы:

Java.lang.IllegalStateException: состояние сохранения отказа: активный сбросил индекс в фрагменте

Что делает активный фрагмент, который очистил индекс: -1 означает и как его исправить?

Получение исключения в качестве состояния сохранения отказа: активный Фрагмент очистил индекс: -1, когда я нажимаю кнопку «домой» устройства Android

IllegalStateException с Android-фрагментами

Solutions Collecting From Web of "Обработка и сглаживание IllegalStateException («состояние сохранения сбрасывания: активный $ Фрагмент очистил индекс: -1»)"

Я собираюсь изменить предыдущий комментарий и сделать это реальным ответом. setRetainInstance(true) была красной селедкой. По крайней мере, в моем случае. Начать здесь: http://www.localwisdom.com/blog/2013/03/android-error-java-lang-illegalstateexception-failure-saving-state-active-fragmentname/

«Скорее всего, вы пытались выполнить транзакцию фрагмента, в которой у вас не было ссылки на правильный экземпляр фрагмента»

Когда я прочитал, все это имело смысл для меня. Я делал 2 неправильных вещи с фрагментами.

  1. Мои оскорбительные фрагменты были одиночными. (Майор нет-нет)
  2. Я пытался использовать эти же экземпляры фрагментов в действиях без правильного сохранения состояния. (Что может быть достигнуто с помощью упомянутых здесь методов: https://stackoverflow.com/a/12465343/333525 )

(Надеюсь, это поможет. Это слишком долго для комментариев.)

В моем случае я забыл проверить, был ли fragment добавлен перед отсоединением и присоединением:

 if (fragment != null && fragment.isAdded()) { getSupportFragmentManager() .beginTransaction() .detach(fragment) .attach(fragment) .commit(); }