これは、Fragments での関数 replace() の動作を理解することに関する質問であり、私の意見では直感的ではありません。
1) ID = R.id.content_fragment の XML に空の FrameLayout があります。
2) コードで、いつものように Fragment を FrameLayout に追加します (ユーザーが以前に追加された Fragment に戻れるようにバックスタックを保持したい)
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.add(R.id.content_fragment, new MyFragment1(), "tag1");
ft.addToBackStack(null);
ft.commit();
3) ここで、FrameLayout のコンテンツをまったく新しい Fragment に置き換えたいと考えています (置き換えたいので、古いフラグメントがバックスタックから消えることを期待しています)。
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_fragment, new MyFragment2(), "tag2");
ft.addToBackStack(null);
ft.commit();
4) 戻ると、古い MyFragment1 が表示されます!! どうしてですか?「置換」+「addToBackStack」は単純な「追加」として機能していますか? なんで?
ありがとう
編集:
例:
frag1 を追加
Frag2を追加
add frag3 --> 3 つのフラグメントのバックスタックがあります
frag4 を置き換えます --> FrameLayout のコンテンツ全体を frag4 に置き換えているため、1 つのフラグメントのバックスタックが必要です。
frag5 を追加 --> バックスタックに 2 つのフラグメント (frag4 と frag5) があると予想されます
frag6 を置き換えます --> バックスタックが 1 になることを期待します (frag6)