Что хранится в Back Stack у FragmentManager

Ответ

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. Если он ноль, то откатится всё ДО этой записи, но сама она останется. Если поставишь флаг — то она тоже вылетит в трубу. Хуй с горы, правда? Но иногда без этого никуда.

А ещё главный нюанс, от которого мозг может вскипеть: в одной транзакции можно наделать делов с несколькими фрагментами сразу — скрыть один, добавить два, заменить третий. И вся эта кухня упаковывается в ОДНУ запись в стеке. Нажал "Назад" — и вся эта многоходовочка откатывается разом, как домино. Красота, ядрёна вошь!

Короче, запомни: стек — это не склад фрагментов, а архив твоих команд. И откат работает не на фрагменты, а на целые транзакции. Как-то так, блядь.