Я портировал свое Android-приложение на сотовые и сделал большой рефакторинг, чтобы использовать фрагменты. В моей предыдущей версии, когда я нажимал кнопку «Домой», я делалACTIVITY_CLEAR_TOP
для сброса заднего стека.
Теперь мое приложение представляет собой одно действие с несколькими фрагментами, поэтому, когда я нажимаю кнопку «Домой», я просто заменяю один из фрагментов внутри него. Как я могу очистить свой стек обратно без необходимости использовать startActivity
с ACTIVITY_CLEAR_TOP
флагом?
android
android-fragments
biquillo
источник
источник
Ответы:
Я выложил нечто подобное здесь
Из ответа Иоахима от Дайан Хакборн:
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
В итоге я просто использовал:
Но в равной степени мог бы использовать что-то вроде:
Который выскочит все состояния до названного. Затем вы можете просто заменить фрагмент на то, что вы хотите
источник
Чтобы ответить на комментарий @ Warpzit и облегчить поиск для других.
Использование:
источник
При всем уважении ко всем вовлеченным сторонам; Я очень удивлен, увидев, сколько из вас может очистить весь стек обратно с помощью простого
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
Согласно документации Android (в отношении
name
аргумента - «ноль» в заявленных рабочих предложениях).Теперь я понимаю, что мне не хватает знаний о ваших конкретных реализациях (например, сколько записей у вас в заднем стеке на данный момент времени), но я бы поставил все свои деньги на принятый ответ, ожидая четко определенного Поведение более широкого круга устройств и поставщиков:
(для справки, что-то вместе с этим)
источник
У меня работает и простой способ без использования цикла:
источник
Принятого ответа мне не хватило. Я должен был использовать:
источник
popBackStackImmediate()
транзакция выполняется синхронно, что, как правило, не рекомендуется.Очистить бэкстек без петель
Где name это параметр addToBackStack ()
источник
Я просто хотел добавить:
Выскочить из backstack, используя следующие
это просто удаление фрагментов из транзакции, и ни в коем случае не удаление фрагмента с экрана. Поэтому в идеале он может быть невидим для вас, но может быть два или три фрагмента, накладываемые друг на друга, и при нажатии клавиши «назад» пользовательский интерфейс может выглядеть загроможденным, сложенным.
Просто приведу простой пример:
Предположим, у вас есть фрагмент A, который загружает Fragmnet B с использованием fragmanager.replace (), а затем мы добавляем addToBackStack, чтобы сохранить эту транзакцию. Итак, поток:
ШАГ 1 -> FragmentA-> FragmentB (мы переместились в FragmentB, но Fragment A находится в фоновом режиме, не виден).
Теперь вы выполняете некоторую работу во фрагменте B и нажимаете кнопку «Сохранить», которая после сохранения должна вернуться к фрагменту A.
ШАГ 2-> При сохранении FragmentB мы возвращаемся к FragmentA.
ШАГ 3 -> Так что распространенная ошибка будет ... во фрагменте B мы сделаем фрагмент Manager.replace () фрагментB с фрагментом A.
Но что на самом деле происходит, мы снова загружаем фрагмент А, заменяя фрагмент Б. Итак, теперь есть два фрагмента A (один из STEP-1 и один из этого STEP-3).
Два экземпляра фрагментов A накладываются друг на друга, которые могут быть не видны, но они есть.
Таким образом, даже если мы очищаем backstack вышеупомянутыми методами, транзакция очищается, но не фактические фрагменты. Так что в идеале в таком конкретном случае при нажатии кнопки сохранения вам просто нужно вернуться к фрагменту A, просто выполнив fm.popBackStack () или fm.popBackImmediate () .
Так что правильно Step3-> fm.popBackStack () вернуться к фрагменту A, который уже находится в памяти.
источник
Читая документацию и изучая, что такое идентификатор фрагмента, он выглядит просто как индекс стека, так что это работает:
Ноль (
0
) - это нижняя часть стека, поэтому всплывающее окно до него включительно очищает стек.ПРЕДУПРЕЖДЕНИЕ. Хотя вышесказанное работает в моей программе, я немного сомневаюсь, потому что документация FragmentManager фактически никогда не утверждает, что id является индексом стека. Это имеет смысл, и все мои журналы отладки показывают, что это так, но, может быть, в некоторых особых обстоятельствах это не так? Кто-нибудь может подтвердить это так или иначе? Если это так, то вышеупомянутое является лучшим решением. Если нет, то это альтернатива:
источник
fragmentManager..getBackStackEntryAt(0).getId()
вместо 0? Это должно работать, даже если идентификаторы записей backstack в какой-то момент отличаются от индекса стека.использование
источник
Привет ~ Я нашел решение, которое гораздо лучше, с: https://gist.github.com/ikew0ng/8297033
источник
Я получил это работает так:
источник
Это работает для меня, попробуйте это:
источник
Вызов этого метода будет очень аккуратным.
источник
источник