AppCompat Fragment生命周期发生了变化

Kir*_*ill 5 android android-appcompat android-lifecycle android-fragments fragment-lifecycle

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

例如我有两个片段FrFirstFrSecond用日志中onStartonStop,并用我第一替换第一与第二,然后第二:FrFirst -> FrSecond -> FrFirst.

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content, new FrSecond())
    .commit();
Run Code Online (Sandbox Code Playgroud)

在以前的appcompat版本中,我可以读取此日志:

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

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

在25.1.0中这个日志:

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

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

所以现在onStart呈现onStop当前之前调用的片段.

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

Kir*_*ill 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();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!不知道为什么google没有在他们的支持lib changelog中提到这个基本的片段生命周期变化(!!!). (3认同)