Обработка и сглаживание IllegalStateException ( "состояние сохранения сбрасывания: активное $Фрагмент очистил индекс: -1" )
Мое приложение для Android управляет несколькими фрагментами. Однако я вижу большое количество сбоев в поле, содержащих эту строку журнала:
java.lang.IllegalStateException: состояние сохранения отказа: активный XxxFragment {81e598 id = 0x7f0b0069 tag_yyy} очистил индекс: -1
Поиски ответов в Qaru были бесплодны; Кажется, у меня много компаний, которые задаются вопросом, что именно это означает. Копаясь в трассировке исключений и в источниках Android, я вижу, что исключение происходит с того момента, когда моя основная активность сохраняет свое состояние (FragmentActivity.onSaveInstanceState), а отдельные фрагменты записываются в Parcelable. Каждый фрагмент имеет индекс (называемый mIndex), который должен быть неотрицательным, но это не совсем понятно из кода, почему это должно быть так, поскольку mIndex больше никогда не используется в этой функции.
У меня нет хорошей идеи, как Фрагмент попадает в это состояние или что я могу с этим поделать. Я не смог воспроизвести ошибку в своей тестовой среде. Может ли кто-нибудь пролить свет на то, как избежать и/или справиться с этим исключением?
Связанные вопросы SO:
java.lang.IllegalStateException: Сбой сохранения состояния: активный сбросил индекс в фрагменте
Что делает активный фрагмент, очищенный индекс: -1 и как его исправить?
Получение исключения в качестве состояния сохранения сбоя: активный Фрагмент очистил индекс: -1, когда я нажимаю кнопку дома для Android-устройства
IllegalStateException с фрагментами Android
Ответы
Ответ 1
Я собираюсь изменить предыдущий комментарий и сделать это реальным ответом. setRetainInstance(true)
была красной селедкой. По крайней мере, в моем случае. Начать здесь: http://www.localwisdom.com/blog/2013/03/android-error-java-lang-illegalstateexception-failure-saving-state-active-fragmentname/
"Скорее всего, вы пытались выполнить транзакцию фрагмента, в которой у вас не было ссылки на правильный экземпляр фрагмента"
Когда я прочитал, все это имело смысл для меня. Я делал 2 неправильных вещи с фрагментами.
- Мои оскорбительные фрагменты были одиночными. (Major no-no)
- Я пытался использовать эти те же фрагменты экземпляра в действиях без правильного сохранения состояния. (Что может быть достигнуто с помощью упомянутых здесь методов: fooobar.com/questions/368264/...)
(Надеюсь, это поможет. Это слишком долго для комментариев.)
Ответ 2
В моем случае я забыл проверить, что fragment
был добавлен перед отсоединением и присоединением:
if (fragment != null && fragment.isAdded()) {
getSupportFragmentManager()
.beginTransaction()
.detach(fragment)
.attach(fragment)
.commit();
}