342

これらのメソッドの呼び出しの主な違いは何ですか:

fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);

既存のフラグメントを置き換え、アクティビティの状態にフラグメントを追加し、バックスタックにアクティビティを追加するとはどういう意味ですか?

第二に、これは/メソッドまたはメソッドfindFragmentByTag()によって追加されたタグを検索しますか?add()replace()addToBackStack()

4

9 に答える 9

369

addとのもう 1 つの重要な違いreplaceは次のとおりです。

replace既存のフラグメントを削除し、新しいフラグメントを追加します。これは、戻るボタンを押すと、置き換えられたフラグメントonCreateViewが呼び出されて作成されることを意味します。add既存のフラグメントを保持し、新しいフラグメントを追加するのに対し、既存のフラグメントがアクティブになり、「一時停止」状態にならないことを意味するため、戻るボタンが押されたときonCreateViewに、既存のフラグメントに対して呼び出されません (新しいフラグメントが存在する前にあったフラグメント)追加した)。

フラグメントのライフ サイクル イベントに関しては onPauseonResumeonCreateViewおよびその他のライフ サイクル イベントは の場合に呼び出されますが、 の場合にはreplace呼び出されませんadd

編集: 彼女がGreenrobot の Eventbus のようなある種のイベント バス ライブラリを使用し、同じフラグメントを再利用してフラグメントを他の via の上にスタックする 場合は注意が必要ですadd。このシナリオでは、ベスト プラクティスに従って でイベント バスonResumeを登録し、 で登録解除しても、フラグメントはこれらのフラグメント ライフ サイクル メソッドのいずれかを呼び出さないonPauseため、追加されたフラグメントの各インスタンスでイベント バスが引き続きアクティブになります。addその結果、フラグメントのアクティブなインスタンスごとにイベント バス リスナーが同じイベントを処理することになりますが、これは望ましくない場合があります。

于 2014-02-10T17:56:21.150 に答える