AppCompat Fragment生命周期变化

5
更新到新的appcompat库com.android.support:appcompat-v7:25.1.0之后,我在事务中替换片段时得到了新的片段生命周期。
例如,我有两个片段FrFirstFrSecond,它们在onStartonStop中记录日志,并将第一个片段替换为第二个片段,然后再将第二个片段替换为第一个片段:FrFirst -> FrSecond -> FrFirst
getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content, new FrSecond())
    .commit();

在之前的appcompat版本中,我可以阅读到以下日志:

FrFirst: 导航到第二个界面
FrFirst: 停止
FrSecond: 开始

FrSecond: 导航到第一个界面
FrSecond: 停止
FrFirst: 开始

在25.1.0版本中,日志变成了这样:

FrFirst: 导航到第二个界面
FrSecond: 开始
FrFirst: 停止

FrSecond: 导航到第一个界面
FrFirst: 开始
FrSecond: 停止

所以现在呈现片段的onStart方法会在当前片段的onStop方法之前被调用。
为什么方法顺序改变了?这是支持库中的一个bug吗?

请查看以下链接:https://androidlearnersite.wordpress.com/2017/02/27/fragment-lifecycle-during-fragment-transaction/。该链接详细解释了最新的appcompat版本中,在片段事务期间片段生命周期的变化。 - Android Developer
1个回答

6
这是新的appcompat的预期行为。正如https://code.google.com/p/android/issues/detail?id=230415所描述的那样,这是一种优化操作并推迟片段转换的新功能,这是其副作用之一。
您可以通过调用FragmentTransaction.setAllowOptimization(false)来禁用片段操作优化。这将强制按正确顺序执行所有操作,但也会禁止优化操作。
因此,如果您想看到旧的行为,可以使用禁用优化的片段替换它们。
getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content, new FrSecond())
    .setAllowOptimization(false)
    .commit();

3
谢谢!不知道为什么 Google 在他们的支持库变更日志中没有提到这个基本的片段生命周期改变(!!!)。 - donfuxx

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