これらのメソッドを呼び出す場合の主な違いは何ですか?
fragmentTransaction.addToBackStack(name);
fragmentTransaction.replace(containerViewId, fragment, tag);
fragmentTransaction.add(containerViewId, fragment, tag);
既存のフラグメントを置き換え、フラグメントをアクティビティ状態に追加し、アクティビティをバックスタックに追加するとはどういう意味ですか?
次に、 では、/メソッドによって追加されたタグを検索するのでしょうか、それともメソッドfindFragmentByTag()
によって追加されたタグを検索するのでしょうか?add()
replace()
addToBackStack()
ベストアンサー1
add
とのもう一つの重要な違いはreplace
次のとおりです。
replace
既存のフラグメントを削除し、新しいフラグメントを追加します。つまり、[戻る] ボタンを押すと、置き換えられたフラグメントが作成され、onCreateView
呼び出されます。一方、 [戻る] ボタンを押すとadd
、既存のフラグメントが保持され、新しいフラグメントが追加されます。つまり、既存のフラグメントはアクティブになり、[一時停止] 状態にはなりません。そのため、[戻る] ボタンを押しても、onCreateView
既存のフラグメント (新しいフラグメントが追加される前に存在していたフラグメント) は呼び出されません。
フラグメントのライフサイクル イベントに関してはonPause
、、onResume
およびonCreateView
その他のライフサイクル イベントは の場合には呼び出されますreplace
が、 の場合には呼び出されませんadd
。
編集:彼女が次のようなイベントバスライブラリを使用している場合は注意が必要です。Greenrobot のイベントバス同じフラグメントを再利用して、 を介してフラグメントを他のフラグメントの上にスタックしますadd
。このシナリオでは、ベスト プラクティスに従って でイベント バスを登録しonResume
、 で登録解除したとしてもonPause
、フラグメントはこれらのフラグメント ライフ サイクル メソッドのいずれも呼び出さないため、追加されたフラグメントの各インスタンスでイベント バスは引き続きアクティブになりますadd
。その結果、フラグメントの各アクティブ インスタンスのイベント バス リスナーは同じイベントを処理することになり、これは望ましくない結果になる可能性があります。