Ответ
Back Stack (стек возврата) FragmentManager содержит последовательность транзакций с фрагментами. При замене/добавлении фрагмента через addToBackStack(null), в стек помещается не сам фрагмент, а запись о транзакции (FragmentTransaction). При нажатии "Назад" система отменяет последнюю транзакцию из стека.
Пример:
supportFragmentManager.beginTransaction()
.replace(R.id.container, FragmentB())
.addToBackStack("transaction_B") // можно указать имя
.commit()
Нюансы:
- Стек может содержать транзакции с несколькими фрагментами
- Имя в
addToBackStack()используется для поиска транзакции (например,popBackStack("name", 0)) popBackStack()удаляет транзакции до указанной (POP_BACK_STACK_INCLUSIVE)
Ответ 18+ 🔞
А, слушай, вот эта тема с бэкстеком во фрагментах — это вообще отдельная песня, ёпта. Представь себе, что ты в баре: каждый раз, когда ты заказываешь новый коктейль (то бишь запускаешь фрагмент), бармен не просто ставит стакан на стол, а, если попросишь, записывает на бумажке, что ты там заказал и в каком порядке. Эта пачка бумажек — и есть твой бэкстек.
Так вот, когда ты делаешь addToBackStack(null), ты не суёшь сам фрагмент, как бутерброд, в этот стек. Ты кладёшь туда запись о всей своей авантюре — о транзакции. Это как чек из магазина: там не сам телевизор, а бумажка, что ты его купил. Нажал "Назад" — система берёт последний чек и откатывает по нему операцию. Овердохуища логики, но в целом гениально.
Смотри на код, тут всё просто:
supportFragmentManager.beginTransaction()
.replace(R.id.container, FragmentB())
.addToBackStack("transaction_B") // можно и имя вписать, не обязательно null
.commit()
Вот этот "transaction_B" — это не просто так, чувак. Это как ты назовёшь эту запись в стеке. Потом, если захочешь, можешь сказать системе: «Вернись, сука, именно к состоянию после транзакции с именем transaction_B». Делается это через popBackStack("transaction_B", 0). Ноль в конце — это флаг, обычно POP_BACK_STACK_INCLUSIVE. Если он ноль, то откатится всё ДО этой записи, но сама она останется. Если поставишь флаг — то она тоже вылетит в трубу. Хуй с горы, правда? Но иногда без этого никуда.
А ещё главный нюанс, от которого мозг может вскипеть: в одной транзакции можно наделать делов с несколькими фрагментами сразу — скрыть один, добавить два, заменить третий. И вся эта кухня упаковывается в ОДНУ запись в стеке. Нажал "Назад" — и вся эта многоходовочка откатывается разом, как домино. Красота, ядрёна вошь!
Короче, запомни: стек — это не склад фрагментов, а архив твоих команд. И откат работает не на фрагменты, а на целые транзакции. Как-то так, блядь.