根据docs
片段事务只能在之前创建/提交 活动拯救其国家。如果您尝试提交事务后 Activity.onSaveInstanceState()(以及之前的内容 Activity.onStart或Activity.onResume(),您将收到错误。
我可以理解,在Activity.onSaveInstanceState()之后片段事务无法提交的第一部分, 因为如果活动需要恢复,提交后的状态可能会丢失。
但我不明白为什么我们不能在Activity.onStart或Activity.onResume()之前提交片段事务? Oncreate()也在Activity.onStart或Activity.onResume()之前。这是否意味着我们甚至无法在oncreate()中提交它?
答案 0 :(得分:4)
这里的关键是,在调用onSaveInstanceState()
之后以及之后的 onStart()
或onResume()
之前,您无法提交交易。
您可以在初始onCreate()
和后续onStart()
或onResume()
上提交交易,因为没有州。
但是,如果Activity正在恢复其状态(即先前已调用onSaveInstanceState()
,并且Activity正在使用该状态重新创建自身,则无法执行Fragment事务。这是因为如果您先提交Fragment事务对于恢复上一个Fragment状态的Activity,最终会导致不清楚你所处的状态。保存的状态是否优先于你通过提交Fragment事务创建的新状态,还是新事务优先于保存的状态?
检查此方案的最简单方法是检查传递给savedInstanceState
的{{1}}包和其他生命周期方法是否为空。如果它为空,则没有已保存的状态,您可以安全地执行交易。如果它不为null,则存在您可能想要保留的保存状态。
答案 1 :(得分:1)
之前 <{strong> onSaveInstanceState()
,这基本上意味着在onPause()/onResume()
之前,并且如果您的活动曾转到onPause()
,那么它是安全的#39;仅在onResume()
之后才安全。
例如,在onActivityResult()
期间,您实际上没有onResume()
之后,因此在onActivityResult()
中打开对话框可能会崩溃。
答案 2 :(得分:0)
可能要记住已提交的交易可能 已执行。
这处理:
getSupportFragmentManager().executePendingTransactions();