Я просто хотел добавить: -
Выход из backstack с использованием следующего
fragmentManager.popBackStack ()
- это просто удаление фрагментов из транзакции, ни в коем случае не удаление фрагмента с экрана.
Поэтому в идеале он может быть невидим для вас, но может быть два или три фрагмента, накладываемые друг на друга, и при нажатии клавиши «назад» пользовательский интерфейс может выглядеть загроможденным, сложенным.
Просто приведу простой пример: -
Предположим, у вас есть фрагмент A, который загружает Fragmnet B с использованием fragmanager.replace () , а затем мы добавляем addToBackStack, чтобы сохранить эту транзакцию.
Итак, поток: -
ШАГ 1 -> FragmentA-> FragmentB (мы переместились во FragmentB, но Fragment A находится в фоновом режиме, не виден).
Теперь вы выполняете некоторую работу во фрагменте B и нажимаете кнопку «Сохранить», которая после сохранения должна вернуться к фрагменту A.
ШАГ 2-> При сохранении фрагмента B мы возвращаемся к фрагменту A.
ШАГ 3 -> Такая распространенная ошибка будет ... во фрагменте B мы сделаем фрагмент Manager.replace () фрагментB с фрагментом A.
Но что на самом деле происходит, мы снова загружаем Фрагмент A, заменяя FragmentB. Итак, теперь есть два фрагмента A (один из STEP-1 и один из этого STEP-3).
Два экземпляра фрагментов A накладываются друг на друга, которые могут быть невидимы, но они есть.
Таким образом, даже если мы очищаем backstack вышеупомянутыми методами, транзакция очищается, но не фактические фрагменты.
Так что в идеальном случае в таком конкретном случае при нажатии кнопки сохранения вам просто нужно вернуться к фрагменту A, просто выполнив fm.popBackStack () или fm.popBackImmediate () .
Так что правильно Step3-> fm.popBackStack () вернуться к фрагменту A, который уже находится в памяти.