Очистить стек Android Fragment обратно без появления?

У нас есть Activity, который содержит SlidingMenu ( https://github.com/jfeinstein10/SlidingMenu ), в котором есть три варианта, назовем их A, B1, C1. Они соответствуют фрагментам, которые мы показываем в Деятельности. Когда вы выбираете другую опцию из SlidingMenu, я заменяю текущий фрагмент на новый с помощью FragmentManager.

Из фрагмента B1 вы можете перейти к двум другим, назовем их B2 и B3. Здесь мы хотим, чтобы клавиша «Назад» взяла вас из B2 -> B1 или из B3 -> B1, поэтому я вызываю transaction.addToBackStack (null). Если мы выберем опцию из SlidingMenu, когда вы на B2 или B3, мы хотим очистить задний стек, поэтому я использую код, предложенный в этом вопросе. Очистить стек, используя фрагменты, которые вызывают popBackStack (), пока не станет ясно.

Все идет нормально.

Из фрагмента C1 вы можете перейти к фрагменту C2. Поскольку C1 / C2 больше представляют собой проект Master / Detail, я использую

fragmentTransaction.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_to_left, R.animator.slide_in_from_left, R.animator.slide_out_to_right); 

Чтобы добавить слайд-анимацию, где C1 скользит влево, а C2 сдвигается справа, и наоборот. Нажатие клавиши «Назад» во время включения C2 возвращает нас к C1, с обратной анимацией, и все хорошо.

НО

Если вы выбираете A или B1 из SlidingMenu, и мы popBackStack (), чтобы избавиться от C1 из заднего стека, тогда он сдвигает C2 вправо, что выглядит странно. То, что я хотел бы сделать, это очистить задний стек, не запуская анимацию, но я не могу найти способ сделать это. Я попытался вызвать popBackStackImmediate () вместо этого, но это, похоже, не имеет никакого значения.

В качестве альтернативы, я предполагаю, что я мог бы вообще не вызвать вызов addToBackStack, а вместо этого вручную обработать пользователя, нажимая клавишу Back через Activity.onBackPressed (), но, возможно, есть решение, которое я просто не вижу?

Solutions Collecting From Web of "Очистить стек Android Fragment обратно без появления?"

Вы можете попробовать следовать, хотя я незнаком с .remove() кажется, что он должен делать то, что вы хотите:

 myFragmentClass myFragC1 = (myFragmentClass) getFragmentManager().findFragmentByTag("theTagYouUsedWhenAddingToBackStack"); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.remove(myFragC1); transaction.commit(); 

К сожалению, я не знаю, как сделать это правильно, поэтому вот мое решение (на самом деле я полностью изменил другой ответ stackoverflow)

В базовом фрагменте, который распространяется на все остальные фрагменты):

 public static boolean sDisableExitAnimation = false; @Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { if (sDisableExitAnimation && !enter) { return AnimationUtils.loadAnimation(getActivity(), R.anim.clear_stack_exit); } return super.onCreateAnimation(transit, enter, nextAnim); } 

Чтобы очистить стек, вам нужно позвонить:

 ScreenFragment.sDisableExitAnimation = true; manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

И, наконец, сама анимация clear_stack_exit (я не нашел способ получить ее из самого FragmentManager):

 <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <alpha android:fromAlpha="1" android:toAlpha="0" android:duration="220" /> <scale android:fromXScale="1" android:toXScale="0.975" android:fromYScale="1" android:toYScale="0.975" android:pivotX="50%" android:pivotY="50%" android:duration="220" /> </set> 

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