Сбой FragmentManager для Android 11 (только) — FragmentManager уничтожен

#android #kotlin #android-fragments #android-activity #android-11

#Android #kotlin #android-фрагменты #android-активность #android-11

Вопрос:

Произошли ли какие-либо заметные изменения в жизненном цикле Android 11, которые кто-нибудь заметил?

Мое приложение отлично работает на операционных системах до Android 11, но на моем Pixel 4 каждый раз вылетает с ошибкой:

 E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: Fragment host has been destroyed
  

Есть ли что-нибудь под капотом, что кто-нибудь еще заметил, чтобы просто повлиять на их приложение на Android 11?

Я использую разные файлы для активности и фрагментов.

У меня есть TreasureHuntActivity , который вызывает onCreate:

 val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.container, TreasureHuntMapFragment.newInstance(), "map-${index}").addToBackStack("map-${index}").commit()
fragmentManager.executePendingTransactions()
  

В TreasureHuntMapFragment ит-вызовах

 val intent = Intent(context, MainUnityActivity::class.java)
activity.startActivityForResult(intent, 33)
Handler().postDelayed({ activity.pushQuestionHintFragment() }, 1000)
  

Вернувшись, TreasureHuntActivity он вызывает TreasureHuntQuestionHintFragment , чтобы показать

 fun pushQuestionHintFragment() {
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.container, TreasureHuntQuestionHintFragment.newInstance(), "questionHintFragment-${specificQuestionId}").addToBackStack("questionHintFragment-${specificQuestionId}").commitAllowingStateLoss()
fragmentManager.executePendingTransactions()
}
  

Это работает на pre Android 11, где оно работает отлично, как уже упоминалось, сейчас оно не работает на 11 . При дальнейшей отладке он отображается fragmentManager как null, который ранее был объявлен как
var fragmentManager = supportFragmentManager
глобально в TreasureHuntActivity

Если я выполняю отладку на Pixel 2 (более ранняя версия Android), значение fragmentManager не равно нулю и равно BackStackEntry .

Я попытался обновить приличия до 2.2.0 или 2.3.0-alpha07 для жизненного цикла или фрагмента до 1.3.0 и все равно не испытал радости.

Значение fragmentManager null только при запуске Android 11 при вызове pushQuestionHintFragment() . Если я отлаживаю, this.isDestroyed это тоже верно, но только на Android 11.

Ответ №1:

Используйте supportFragmentManager вместо fragmentManager

 fun pushQuestionHintFragment() {
    val fragmentTransaction = supportFragmentManager.beginTransaction()
    fragmentTransaction.replace(
                R.id.container,
                TreasureHuntQuestionHintFragment.newInstance(),
                "questionHintFragment-${specificQuestionId}").addToBackStack("questionHintFragment-${specificQuestionId}")
                       .commitAllowingStateLoss()
    supportFragmentManager.executePendingTransactions()
 }