Задний стек FragmentManager обновляется только в двух случаях:
- Вы совершаете транзакцию FragmentTransaction, используя
addToBackStack()
- Звоните
popBackStack()
Никакая другая операция не влияет на задний стек - дополнительные FragmentTransactions без addToBackStack()
только изменяют текущее состояние и не влияют на то, что происходит при вызове popBackStack()
и т. Д.
Если вы хотите, чтобы ваш стек перешел с A
на A -> B
, вы должны использовать FragmentTransaction с addToBackStack
(и, как правило, replace
операция):
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragmentB)
.addToBackStack("b")
.commit();
Затем вы хотите, чтобы ваш стек обратно составлял от A -> B
до A -> C
, вам необходимо выполнить две операции:
// First pop B
fragmentManager.popBackStack("b", FragmentManager.POP_BACK_STACK_INCLUSIVE)
// Then addToBackStack C
fragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, fragmentC)
.addToBackStack("c")
.commit();
Это гарантирует, что ваш FragmentB
будет удален из стека перед добавлением FragmentC
в задний стек.
Аналогичным образом, если вы хотите удалить FragmentC
и вернуться к FragmentA
, вы просто вытолкнете его из заднего стека:
// Pop C, returning back to A
fragmentManager.popBackStack("c", FragmentManager.POP_BACK_STACK_INCLUSIVE)
Примечание: никогда не рекомендуется смешивать обратно стек FragmentTransactions и обычные FragmentTransactions в одном и том же FragmentManager, поскольку popBackStack()
не учитывает текущее состояние FragmentManager
, а вместо этого просто слепо инвертирует FragmentTransaction на задний стек (т. е. последняя транзакция Fragment с addToBackStack()
.