Очистить задний стек с помощью фрагментов

Я портировал приложение для Android на сотовые устройства, и я использовал большой рефакторинг для использования фрагментов. В моей предыдущей версии, когда я нажал кнопку «Домой», я использовал ACTIVITY_CLEAR_TOP , чтобы сбросить задний стек.

Теперь мое приложение – это всего лишь одно действие с несколькими фрагментами, поэтому, когда я нажимаю кнопку «Домой», я просто заменяю один из фрагментов внутри него. Как я могу удалить свой задний стек без использования функции startActivity с флагом ACTIVITY_CLEAR_TOP ?

Solutions Collecting From Web of "Очистить задний стек с помощью фрагментов"

Я написал что-то похожее здесь

Из ответа Йоахима, от Дианы Хакборн:

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

Я закончил тем, что использовал:

 FragmentManager fm = getActivity().getSupportFragmentManager(); for(int i = 0; i < fm.getBackStackEntryCount(); ++i) { fm.popBackStack(); } 

Но в равной мере можно было использовать что-то вроде:

 FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE) 

Который выведет все состояния до названного. Затем вы можете просто заменить фрагмент тем, что вы хотите

Чтобы ответить на комментарий @ Warpzit и облегчить другим поиск … Использование:

 fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

При всем уважении к всем вовлеченным сторонам; Я очень удивлен, увидев, как многие из вас могут очистить весь фрагмент назад с помощью простого

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

Согласно документации Android (в отношении аргумента name – «null» в заявленных рабочих предложениях).

Если значение null, то отображается только верхнее состояние

Теперь я понимаю, что мне не хватает знаний о ваших конкретных реализациях (например, сколько записей у вас в заднем стеке в данный момент времени), но я бы поставил все свои деньги на принятый ответ, ожидая четко определенных Поведение более широкого спектра устройств и поставщиков:

(Для справки, что-то вместе с этим)

 FragmentManager fm = getFragmentManager(); // or 'getSupportFragmentManager();' int count = fm.getBackStackEntryCount(); for(int i = 0; i < count; ++i) { fm.popBackStack(); } 

Принятого ответа было недостаточно для меня. Мне пришлось использовать:

 FragmentManager fm = getSupportFragmentManager(); int count = fm.getBackStackEntryCount(); for(int i = 0; i < count; ++i) { fm.popBackStackImmediate(); } 

Очистить стопку без петель

 String name = getSupportFragmentManager().getBackStackEntryAt(0).getName(); getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Если имя – это параметр addToBackStack ()

 getSupportFragmentManager().beginTransaction(). .replace(R.id.container, fragments.get(titleCode)) .addToBackStack(name) 

Работает для меня и легко, без использования цикла:

  FragmentManager fragmentManager = getSupportFragmentManager(); //this will clear the back stack and displays no animation on the screen fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Я просто хотел добавить: –

Выскользнуть из backstack, используя следующие

fragmentManager.popBackStack ()

Это просто удаление фрагментов из транзакции, так как он не удалит фрагмент с экрана. Поэтому в идеале это может быть не видно вам, но могут быть два или три фрагмента, сложенные друг над другом, а на задней клавише нажмите интерфейс, который может выглядеть загроможденным, сложным.

Просто возьмем простой пример:

Предположим, что у вас есть фрагмент, который загружает Fragmnet B с помощью функции fragmentmanager.replace (), а затем мы добавляем addToBackStack для сохранения этой транзакции. Таким образом, поток: –

ШАГ 1 -> FragmentA-> FragmentB (мы переместились в FragmentB, но Fragment A находится в фоновом режиме, не видно).

Теперь вы выполните некоторую работу в фрагменте B и нажмите кнопку «Сохранить», которая после сохранения должна вернуться к фрагменту.

STEP 2-> С сохранением FragmentB вернемся к FragmentA.

ШАГ 3 -> Такая распространенная ошибка будет … в фрагменте B, мы сделаем фрагмент Manager.replace () фрагментB с фрагментом.

Но что на самом деле происходит, мы снова загружаем фрагмент A, заменяя FragmentB. Итак, теперь есть два FragmentA (один из STEP-1 и один из этого STEP-3).

Два экземпляра FragmentsA сложены друг над другом, что может быть не видно, но оно есть.

Поэтому, даже если мы очистим стопку вышеупомянутыми методами, транзакция очищается, но не фактические фрагменты. Поэтому в идеале в таком конкретном случае при нажатии кнопки сохранения вам просто нужно вернуться к фрагменту А, просто выполнив fm.popBackStack () или fm.popBackImmediate () .

Итак, верните Step3-> fm.popBackStack () вернитесь к фрагменту, который уже находится в памяти.

Просто используйте этот метод и передайте тег Context & Fragment, которому нужно удалить фрагменты backstake.

Применение

 clearFragmentByTag(context, FragmentName.class.getName()); public static void clearFragmentByTag(Context context, String tag) { try { FragmentManager fm = ((AppCompatActivity) context).getSupportFragmentManager(); for (int i = fm.getBackStackEntryCount() - 1; i >= 0; i--) { String backEntry = fm.getBackStackEntryAt(i).getName(); if (backEntry.equals(tag)) { break; } else { fm.popBackStack(); } } } catch (Exception e) { System.out.print("!====Popbackstack error : " + e); e.printStackTrace(); } } 

Я получил эту работу следующим образом:

 public void showHome() { getHandler().post(new Runnable() { @Override public void run() { final FragmentManager fm = getSupportFragmentManager(); while (fm.getBackStackEntryCount() > 0) { fm.popBackStackImmediate(); } } }); } 

Читая документацию и изучая, что такое идентификатор фрагмента, он просто является индексом стека, поэтому это работает:

 fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Zero ( 0 ) – это нижняя часть стека, поэтому всплывающее окно включает в себя стирание стека.

CAVEAT: Несмотря на то, что вышеописанное работает в моей программе, я немного смущаюсь, потому что в документации FragmentManager никогда не указано, что идентификатор является индексом стека. Имеет смысл, что это будет, и все мои журналы отладки обнажают это, но, возможно, в некоторых особых обстоятельствах это не так ли? Может ли кто-нибудь подтвердить это так или иначе? Если это так, то это лучшее решение. Если нет, это альтернатива:

 while(fragmentManager.getBackStackEntryCount() > 0) { fragmentManager.popBackStackImmediate(); }