5

更新到新的 appcompat 库后,com.android.support:appcompat-v7:25.1.0我在事务中替换片段时有了新的片段生命周期。

例如,我有两个片段FrFirstFrSecond登录onStartonStop我将 first 替换为 second ,然后将 second 替换为 first: 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当前之前调用的片段。

为什么方法顺序发生了变化,是支持库中的错误吗?

4

1 回答 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();
于 2016-12-20T06:16:37.617 回答