Android 11(仅限)FragmentManager 崩溃 - FragmentManager 已被销毁

Posted

技术标签:

【中文标题】Android 11(仅限)FragmentManager 崩溃 - FragmentManager 已被销毁【英文标题】:Android 11 (only) FragmentManager crashes - FragmentManager has been destroyed 【发布时间】:2021-01-07 16:04:15 【问题描述】:

android 11 上是否有任何明显的生命周期变化,任何人都注意到了?

我的应用在 Android 11 之前的操作系统上运行良好,但在我的 Pixel 4 上每次都因错误而崩溃:

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

是否有任何其他人注意到只会影响他们在 Android 11 上的应用的幕后情况?

我正在为活动和片段使用不同的文件。

我有一个调用 onCreate 的TreasureHuntActivity

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()

这适用于 Android 11 之前的版本,它可以完美运行,如上所述,它现在不适用于 11+。随着进一步调试,它显示fragmentManager 为空,之前声明为 var fragmentManager = supportFragmentManager 全球TreasureHuntActivity

如果我在 Pixel 2(Android 的早期版本)上进行调试,fragmentManager 不为空,而是BackStackEntry

我尝试将生命周期或片段更新为 2.2.0 或 2.3.0-alpha07 为 1.3.0,但仍然没有任何乐趣。

fragmentManager 仅在 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()
 

【讨论】:

以上是关于Android 11(仅限)FragmentManager 崩溃 - FragmentManager 已被销毁的主要内容,如果未能解决你的问题,请参考以下文章

Android布局中的占位符文本(仅限设计过程)?

带有 Google Play 服务的 Android Studio“仅限设备”位置不起作用

如何使用矢量绘图发布仅限平板电脑的 Android 应用程序

检测 Android 设备上缺少听筒(仅限扬声器)

编辑器中的游戏 UI 已缩放(Unity,仅限 Android)

Firebase Firestore:无法访问Firestore后端(仅限Android)