5

新しい appcompat ライブラリcom.android.support:appcompat-v7:25.1.0に更新した後、トランザクションでフラグメントを置き換えるときに、新しいフラグメント ライフサイクルを取得しました。

たとえば、2 つのフラグメントがFrFirstありFrSecond、logs inonStartおよびonStopがあり、first を second に、次に second を first: に置き換えますFrFirst -> FrSecond -> FrFirst

getActivity().getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content, new FrSecond())
    .commit();

以前の appcompat バージョンでは、次のログを読み取ることができます。

FrFirst: 2 番目に
移動 FrFirst: 停止
FrSecond: 開始

FrSecond: 最初に
移動 FrSecond: 停止
FrFirst: 開始

25.1.0 では、次のログが記録されます。

FrFirst: 2 番目に
移動 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 に答える