当用户改变屏幕方向并执行“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/