Как извлечь фрагмент из бэкстека

У меня есть действие A, которое вызывает фрагмент Bf, который вызывает фрагмент Cf. Я хочу, чтобы Bf помещался в задний стек при вызове Cf, чтобы пользователи могли вернуться к нему. Однако, если в Cf нажата определенная кнопка, я бы хотел, чтобы Bf был удален из backstack. Это возможно?

Я вижу, что есть функция popBackStack (). Однако я немного не понимаю, как это будет работать. Безопасно ли использовать эту функцию? Есть ли вероятность, что действие из другого приложения будет вставлено после Bf в бэкстэк?

Кроме того, есть ли способ изменить savedInstanceState фрагмента в backstack?

Я просто не могу понять, как провести надежный тест на бэкстеке с помощью эмулятора.


person user2085335    schedule 20.02.2013    source источник
comment
Избегайте использования задних стеков! это не очень помогает с общей эффективностью! используйте обычную replace () или, что еще лучше, удаляйте / добавляйте каждый раз, когда хотите перемещаться! Проверьте мой пост на stackoverflow.com/questions/5802141/   -  person stack_ved    schedule 29.09.2014
comment
@stack_ved - не лучшая идея. BackStacks - отличная вещь. Кстати, я не вижу твой пост. Я предполагаю, что это было отклонено. :П   -  person Sufian    schedule 18.11.2016


Ответы (4)


Вы можете выделить фрагмент по имени. Добавляя фрагменты в заднюю стопку, просто дайте им имя.

fragmentTransaction.addToBackStack("fragB");
fragmentTransaction.addToBackStack("fragC");

Затем в Fragment_C вставьте задний стек, используя имя, например .. fragB, и включите POP_BACK_STACK_INCLUSIVE

someButtonInC.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        FragmentManager fm = getActivity()
                .getSupportFragmentManager();
        fm.popBackStack ("fragB", FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
});
person Archie.bpgc    schedule 20.02.2013
comment
Это будет работать, даже если мы не передадим никаких параметров в метод fm.popBackStack. fm.popBackStack (); - person Kailas; 06.03.2014
comment
что, если я хочу сделать это при нажатии кнопки "Назад"? - person Akshay; 15.03.2014
comment
@Akki, если вы используете add to backstack, он уже вытолкнет последний добавленный фрагмент, когда вы нажмете на элемент навигации назад. Таким образом, для выполнения нормальной навигации назад не требуется никаких дополнительных действий. Единственный раз, когда вам нужно переопределить нажатую кнопку «Назад», - это когда вы хотите сделать что-то, кроме обычной навигации на один шаг назад. - person ocross; 09.07.2014
comment
Что, если бы этот фрагмент был первым, тогда addToBackStack с replace вызовет проблему. Есть ли способ сделать это без вызова addToBackStack? - person Hamzeh Soboh; 19.04.2015
comment
Согласно документу, будут выскакивать все состояния до этого состояния, а не только конкретный фрагмент. - person Vahid Ghadiri; 02.09.2015
comment
@VahidGhadiri Так устроена структура данных стека. - person Sreekanth Karumanaghat; 29.08.2017

Три способа извлечь фрагмент из BackStack

Просто добавьте любую из этих строк:

1)

getActivity().getSupportFragmentManager().popBackStack();

2)

getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

3)

getActivity().getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

Все это простые способы извлечь фрагмент из Backstack

person MD Khali    schedule 30.07.2018
comment
Большое вам спасибо! После того, как я переборщил с onbackpressed, это действительно помогло мне вернуться. Искал около часа - person KSDev; 02.07.2020

сначала заменив фрагмент container_view, в этот раз мы добавляем имя как "Later Transaction"

   getSupportFragmentManager().beginTransaction().replace(R.id.container_view, 
    profileFragment, "Profile").addToBackStack("Later Transaction").commit();

затем нажмите кнопку «Назад», чтобы открыть стек назад, используя имя «Поздняя транзакция».

     int count = getSupportFragmentManager().getBackStackEntryCount();
    if(count > 1) {
     getSupportFragmentManager().popBackStack("Later Transaction", 
     FragmentManager.POP_BACK_STACK_INCLUSIVE);
    } else {
        DialogUtils.show(HomeActivity.this, 
        getString(R.string.exit_app_message), getString(R.string.alert), 
       "Yes","No", new DialogUtils.ActionListner() {
            @Override
            public void onPositiveAction() {
                finish();
            }
            @Override
            public void onNegativeAction() {
            }
        });
    }
person Abhijit Rajmane    schedule 27.10.2018
comment
Отличное решение для управления количеством записей в обратном стеке фрагментов - person Abhijit Rajmane; 08.05.2020

Вот пример извлечения последнего фрагмента с помощью BackStackEntry

val manager = supportFragmentManager
try {
    // get last entry (you can get another if needed)
    val entry = manager.getBackStackEntryAt(manager.backStackEntryCount - 1)
    // you can pop it by name
    manager.popBackStack(entry.name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    // or pop by id
    manager.popBackStack(entry.id, FragmentManager.POP_BACK_STACK_INCLUSIVE)
} catch (ex: Exception) {
    ex.printStackTrace()
}
person Andrey Turkovsky    schedule 01.06.2020