什么时候提交FragmentTransaction是安全的?

时间:2016-11-08 15:14:20

标签: android android-fragments fragmenttransaction

根据docs

  

片段事务只能在之前创建/提交   活动拯救其国家。如果您尝试提交事务后   Activity.onSaveInstanceState()(以及之前的内容   Activity.onStart或Activity.onResume(),您将收到错误。

我可以理解,在Activity.onSaveInstanceState()之后片段事务无法提交的第一部分,   因为如果活动需要恢复,提交后的状态可能会丢失。

但我不明白为什么我们不能在Activity.onStart或Activity.onResume()之前提交片段事务? Oncreate()也在Activity.onStart或Activity.onResume()之前。这是否意味着我们甚至无法在oncreate()中提交它?

3 个答案:

答案 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();