Подтвердить что ты не робот

Обработка и сглаживание 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

4b9b3361

Ответ 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();
        }