何时才能安全地提交FragmentTransaction?

5
根据文档,一个片段事务只能在活动保存其状态之前创建/提交。如果您尝试在Activity.onSaveInstanceState()之后(并在以下Activity.onStart或Activity.onResume()之前)提交事务,则会出现错误。我可以理解第一部分,即在Activity.onSaveInstanceState()之后无法提交片段事务,因为如果需要恢复活动,则提交后的状态可能会丢失。但是我不明白为什么我们不能在Activity.onStart或Activity.onResume()之前提交片段事务?Oncreate()也在Activity.onStart或Activity.onResume()之前,这是否意味着我们甚至不能在oncreate()中提交它?
3个回答

6
关键在于,您不能在调用onSaveInstanceState()之后且在下一个onStart()onResume()之前提交事务。您可以在最初的onCreate()和随后的onStart()onResume()上提交事务,因为没有状态。
但是,如果活动正在恢复其状态(即以前已调用onSaveInstanceState()并使用该状态重新创建活动),则无法执行片段事务。这是因为,如果在活动恢复先前的片段状态之前提交片段事务,则会进入不清楚处于什么状态的情况。保存的状态是否优先于通过提交片段事务创建的新状态,还是新事务应优先于保存的状态?
检查此场景的最简单方法是检查传递给onCreate()和其他生命周期方法的savedInstanceState捆绑包是否为null。如果为null,则没有保存的状态,您可以安全执行事务。如果不为null,则有保存的状态,您可能希望保留它。

我不明白为什么onCreate()中没有状态?当savedInstanceState捆绑传递到onCreate()时,状态不是已经被恢复了吗?我们可以在onCreate()或onRestoreInstanceState()中恢复状态。 - user3591494
onCreate() 中的状态还没有被恢复,因为 Activity 刚刚被创建。例如,你甚至还没有创建/设置内容视图,所以保存的视图还没有地方去。如果你愿意,可以在 onCreate() 中恢复 你的 应用程序状态,但这并不意味着所有其他组件都已完成恢复其状态。 - Bryan Herbst
这是否意味着当Oncreate()完成时,setContentView()仍在运行,并且它将继续运行直到onResume()开始运行? - user3591494
内容视图已设置,savedInstanceState bundle(即保存的视图状态)已发送到onCreate(),您能解释为什么在调用onCreate()时视图状态没有被恢复吗? - user3591494
onCreate()被调用时,内容视图尚未设置。通常在onCreate()期间充气内容视图。这是一个微妙但重要的区别,也是您不能假设状态在onCreate()开始时恢复的原因。再次强调,不要过于纠结于Views,因为它们只是可能被恢复的状态的一部分。onRestoreInstanceState()甚至直到onStart()之后才被调用,因此那里正在恢复的任何状态(包括Activity的Window状态)都将在完成后才会恢复。 - Bryan Herbst
显示剩余3条评论

1
任何时候在onSaveInstanceState()之前都是安全的,这基本上意味着在onPause()/onResume()之前,在您的Activity进入onPause()后,只有在onResume()之后才安全。例如,在onActivityResult()期间,您实际上还没有到达onResume()之后,因此在onActivityResult()中打开对话框可能会崩溃。

0

可能需要记住一个已提交的事务可能尚未执行
这个处理程序可以解决这个问题:

getSupportFragmentManager().executePendingTransactions();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接