2016-11-08 33 views
3

按照docs何时可以安全地提交FragmentTransaction?

片段事务才能创建/前一个 活动保存其状态提交。如果尝试后 Activity.onSaveInstanceState()(和之前的以下 Activity.onStart或Activity.onResume()提交事务,你会得到一个错误。

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

但我不理解为什么我们不能提交在Activity.onStart或Activity.onResume()之前的片段事务?Oncreate()也在Activity.onStart或Activity.onResume()之前。是否意味着我们甚至不能在onc中提交它reate()?

回答

3

这里的关键是,你不能在通话后提交事务,以onSaveInstanceState()和之前的以下onStart()onResume()

由于没有状态,您可以在初始的onCreate()和后续的onStart()onResume()上提交事务处理。但是,如果Activity正在恢复其状态(即先前调用了onSaveInstanceState(),并且Activity正在使用该状态重新创建自己,则无法执行Fragment事务,这是因为如果您在Activity之前提交了Fragment事务恢复以前的Fragment状态,最终会出现一种情况,即您不清楚自己身处何种状态。保存的状态优先于您通过提交Fragment事务创建的新状态,还是应该优先于新事务保存的状态?

检查此场景的最简单方法是检查savedInstanceState软件包是否传递给onCreate()和其他生命周期方法为null。如果为null,则重新没有保存状态,您可以安全地执行您的交易。如果它不为空,那么就有可能保存的状态。

+0

我不明白为什么有中无的onCreate状态()? saveInstanceState包传递给onCreate()时,状态还没有恢复?我们可以在onCreate()或onRestoreInstanceState中返回状态。 – user3591494

+0

该状态尚未在'onCreate()'中恢复,因为刚刚创建了Activity。例如,你甚至还没有创建/设置内容视图,所以没有任何地方可以保存视图。如果您愿意,您可以在'onCreate()'中恢复*您的应用程序状态,但这并不意味着所有其他组件都完成恢复其状态。 –

+0

这是否意味着当oncreate()完成时setContentView()仍在运行,它会继续运行,直到onResume()开始运行? – user3591494

1

它是安全的任何时间onSaveInstanceState()之前,onPause()/onResume()之前这基本上意味着,如果你的活动曾经去过onPause(),那么它只有onResume()后是安全的。

例如,在onActivityResult(),你还没有真正去后onResume(),在onActivityResult()所以打开一个对话框可能会崩溃。

0

可能要记住一个致力于交易可能已经执行来承担。
这是处理:

getSupportFragmentManager().executePendingTransactions(); 
相关问题