Как выскочить фрагмент из backstack

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

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

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

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

5 ответов

Решение

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

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);
    }
});

Три способа вытолкнуть фрагмент из 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);

это все простой способ выскочить фрагмент из backdtack

Вы можете попробовать этот способ

      val fm= parentFragmentManager
fm.popBackStack("group", FragmentManager.POP_BACK_STACK_INCLUSIVE)

Вот пример извлечения последнего фрагмента с помощью 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()
}

Сначала заменяя фрагмент container_view, тогда мы добавляем имя как "Поздняя транзакция"

   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() {
            }
        });
    }
Другие вопросы по тегам