I am using a bottom navigation bar in my MainActivity to handle some fragments. This is the code used for switching between them:

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    if (item.isChecked &&
        supportFragmentManager.findFragmentById(R.id.act_main_fragment_container) != null
    )
        return@OnNavigationItemSelectedListener false
    val fragment =
        when (item.itemId) {
            R.id.navigation_home      -> fragments[0]
            R.id.navigation_bookings  -> fragments[1]
            R.id.navigation_messages  -> fragments[2]
            R.id.navigation_dashboard -> fragments[3]
            R.id.navigation_profile   -> fragments[4]
            else                      -> fragments[0]
        }
    this replaceWithNoBackStack fragment
    return@OnNavigationItemSelectedListener true
}

the method replaceWithNoBackstack is just a short-hand for this:

supportFragmentManager
    ?.beginTransaction()
    ?.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
    ?.replace(containerId, fragment)
    ?.commit()

问题是,当我在它们之间切换得更快时,我的应用程序会崩溃,但有以下例外:

java.lang.IllegalStateException:只能在所有者初始化阶段创建restarter 在androidx.savedstate.SavedStateRegistryController.performRestore(SavedStateRegistryController.java:59) 在androidx.fragment.app.Fragment.performCreate(Fragment.java:2580) 在androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:837) 在androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1237) 在androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1302) 在androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439) 在androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2075) 在androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1865) 在androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1820) 在androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1726) 在androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150) 在android.os.Handler.handleCallback(Handler.java:789) 在android.os.Handler.dispatchMessage(Handler.java:98) 在android.os.Looper.loop(Looper.java:164) 在android.app.ActivityThread.main(ActivityThread.java:6709) at java.lang.refect.Method.Invoke(本机方法) 在com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769) 我找了很久,也找不到答案.

I also got this error if I do an API call, put the app in background, wait for the response, and at the time I go back to the app, the app crashes because I am trying to display a dialog fragment immediately (the reason I think this is happening is that the transaction of recreating the fragment when coming back from the background is still in progress at the time of displaying the dialog fragment). I solved this in a hacky way by setting a 500ms delay for the dialog because I couldn't figure out other solutions.

请询问您是否需要有关此的更多详细信息.

POSSIBLE TEMP SOLUTIONS

EDIT

EDIT 2 I solved the issue by removing setTransition() from fragment transactions. At least I know the reason why android apps does not have good transitions in general

EDIT 3

推荐答案

如果您使用的是"androidx".核心:核心ktx:1.0.2',

If you're using lifecycle(or rxFragment) and androidx_appcompat:alpha05, try changeing versio.
ex) appcompat : 1.1.0-beta01 or 1.0.2

我认为,当目标片段被重用(onPause onResume)时,在保存状态时会出现错误.

Kotlin相关问答推荐

在没有外部 map 的情况下转换列表项

Compose:LaunchedEffect在密钥更改后不会重新启动

Kotlin—从列表中枚举属性计算不同值的数量

Gradle Jooq配置自定义生成器

Android Studio中的只读集合不支持操作失败的原因是什么?

如何在不基于数据 map 的情况下将图例添加到lets plot kotlin

为什么使用 return instance ?: synchronized(this) { instance ?: PreferenceParameterState(context) } 时无法获得单例?

使用 kotlin 流删除 map 中具有某些相似性的值

如何在 kotlin 中使用带有泛型的密封类

在 kotlin 中重载函数时,我在一些非常基本的代码上不断收到类型不匹配

你怎么知道什么时候需要 yield()?

使用 Hilt 注入 CoroutineWorker

有没有办法在spring webflux和spring data react中实现分页

Foo::class.java 和 Foo::javaClass 有什么区别?

androidx.core:core-ktx:1.0.0 小部件包丢失

Kotlin 的 Double.toInt() 中使用了哪种方法,舍入还是截断?

(kotlin的Moshi)@Json vs@field:Json

从命令行运行Java到Kotlin转换器?

如何在使用Koin DI的活动之间共享同一个ViewModel实例?

这是 Kotlin 中的错误还是我遗漏了什么?