java - 方向更改崩溃后替换 fragment

标签 java android kotlin

当用户改变屏幕方向并执行“goToDetails”时,FragmentManager 抛出

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

类代码:

@ActivityScope
class NavigatorImpl @Inject constructor(): ActivityLifecycleTask(), Navigator {

private lateinit var fragmentManager: FragmentManager

@IdRes
private var fragmentContainerRes: Int = 0

override fun onCreate(activity: BaseActivity) {
    fragmentManager = activity.supportFragmentManager
    fragmentContainerRes = activity.fragmentContainerRes()
}

override fun init(fragment: BaseFragment) {
    goToFragment(fragment, TAG_INIT_FRAGMENT)
}

override fun goToDetails(id: Long) {
    goToFragment(DetailsFragment.create(id))
}

private fun goToFragment(fragment: Fragment, tag: String? = null) {
    Log.d(javaClass.simpleName, "goToFragment")
    fragmentManager.beginTransaction()
            .add(fragmentContainerRes, fragment, tag)
            .addToBackStack(null)
            .commit()
}

companion object {
    private const val TAG_INIT_FRAGMENT = "TAG_INIT_FRAGMENT"
}
}

commitAllowingInstanceStateLoss() 不工作。 onCreate(activity) 在 Activity onCreate 回调中执行。然后当 savedInstanceState == null 时,执行来自 NavigatorImpl 的 init()

最佳答案

当您旋转屏幕时,您的 Activity 的 onCreate 将执行,但它的 savedInstanceState 不会为 null。如果您不检查它是否为空,您仍然会尝试提交一个新事务来初始化您的 Activity 。所以你应该在初始化你的 fragment 之前检查是否 savedInstanceState == null

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (savedInstanceState == null) {
        // commit your fragment transaction.
    }
}

关于java - 方向更改崩溃后替换 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52835607/

相关文章:

java - 第二个 Activity 标题栏中的后退按钮

java - 尝试使用 LibGDX 登录 GooglePlay 游戏服务时出现 "signInSilently(): failure"

java - 停止 ServerSocket Accept() 循环线程

java - 扩展 GWT 的小部件类

java - Android-在Handler/runnable中启动新的Activity真的很慢

android - 单击时使用Thread.sleep时无法使用setBackgroundResource()

Android Koin,如何使用两个数据源制作存储库?

Kotlin - 为变量赋值或中断并返回函数

Java 容器删除方法无法正常工作

java - 如何在最新的 Android 手机上运行闹钟等后台工作