Неустранимое исключение: java.lang.IllegalStateException: состояние сохранения сбоя: активный фрагмент был удален из FragmentManager

Недавно я изменил свое приложение на целевой уровень API 28, а также начал использовать androidx вместо библиотек поддержки. После изменения я замечаю сбой, который имеет следующую трассировку

Fatal Exception: java.lang.IllegalStateException: Failure saving state: active MyFragment{22caf6fc (04a7bbf5-8806-4a45-a25d-616ed244bf18) id=0x7f1000ff} was removed from the FragmentManager
       at androidx.fragment.app.FragmentManagerImpl.saveAllState(FragmentManagerImpl.java:2301)
       at androidx.fragment.app.FragmentController.saveAllState(FragmentController.java:150)
       at androidx.fragment.app.FragmentActivity.onSaveInstanceState(FragmentActivity.java:496)
       at androidx.appcompat.app.AppCompatActivity.onSaveInstanceState(AppCompatActivity.java:510)
       at com.company.utils.MyAppCompatActivity.onSaveInstanceState(MyAppCompatActivity.java:161)
       at android.app.Activity.performSaveInstanceState(Activity.java:1311)
       at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1288)
       at android.app.ActivityThread.callCallActivityOnSaveInstanceState(ActivityThread.java:4166)
       at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3577)
       at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3633)
       at android.app.ActivityThread.access$1300(ActivityThread.java:164)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1491)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:160)
       at android.app.ActivityThread.main(ActivityThread.java:5541)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759)

Все мои действия происходят от базовой активности MyAppCompatActivity которая распространяется от AppCompatActivity. И в onSaveInstanceState метода MyAppCompatActivity, у меня есть несколько строк журнала там. У меня есть три фрагмента в этом действии, реализованном в ViewPager с FragmentStatePageAdapter и само действие не переопределяет метод onSaveInstanceState.

Я просмотрел несколько SO-сообщений, близких к этому, таких как этот и этот, но похоже, что это происходит, когда мы используем методы FragmentManager для управления фрагментами сами, а не с помощью ViewPagerAdapter. Я этого не делаю, и самое близкое, что я делаю вдали от обычного потока, - это переопределение методов FragmentStatePageAdapter instantiateItem и destroyItem чтобы помочь мне получить метод для получения ссылки на фрагмент в коде, как указано в этом SO-ответе.

Ответ 1

Какую версию библиотеки фрагментов вы использовали? Существует проблема с 1.1.0-alpha01.

Ответ 2

Я использую последний Gradle, как показано ниже

реализация 'androidx.core: core: 1.1.0-alpha03'

Я сравнил сбойный фрагмент с другим фрагментом кода и обнаружил разницу, как показано ниже: У разбивающегося фрагмента есть метод setRetainInstance (true); внутри onCreateView(), как показано в следующем фрагменте.

     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       setRetainInstance(true);
}

Я натолкнулся на ссылку, которая говорит, что не следует использовать setRetainInstance: setRetainInstance - это можно использовать только с фрагментами, которые не находятся в заднем стеке

Я удалил setRetainInstance (true) для сбоя фрагмента; Это работает сейчас.

Как повторить эту проблему: MainActivity → HomeFragment → FirstFragment (сбойный фрагмент) → HomeFragment

MainActivity загружается с HomeFragment, который заменяется на FirstFragment, а затем возвращается к HomeFragment. Затем перемещение моего приложения в фоновый режим и аварийное завершение происходит за исключением следующего.

 java.lang.IllegalStateException: Failure saving state: active 
FirstFragment{fd50037 (4a8b618e-a0a8-45d0-aa37-ba08393b8f68)
 id=0x7f08009c} was removed from the FragmentManager

Ответ 3

У меня не было никакого setRetainInstance (true); Когда я просматривал свой код, я увидел, что была другая транзакция, которую я делал, используя менеджер фрагментов в onResume для того же фрагмента.