Как выскочить фрагмент из 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
Просто добавьте эту строку
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() {
}
});
}