у меня есть эти методы для манипулирования фрагмента:Android FragmentManager вызывает onCreateView при очистке фрагментов
public void replaceFragment(Fragment fragment) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment);
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
}
public void addFragment(Fragment fragment, boolean addToBackStack) {
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment);
if (addToBackStack) {
fragmentTransaction.addToBackStack(fragment.getClass().getName());
}
fragmentTransaction.commit();
fragmentManager.executePendingTransactions();
}
public void clearFragments() {
if (fragmentManager.getBackStackEntryCount() > 0) {
FragmentManager.BackStackEntry first = fragmentManager.getBackStackEntryAt(0);
fragmentManager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}
Сценарий:
Я начинаю с фрагментом А, когда активность создается. addFragment (новый A, false);
Затем я добавляю фрагмент B. replaceFragment (новый B);
Я добавляю еще один фрагмент C. addFragment (новый C);
В фрагменте C Я хочу сбросить приложение до фрагмента. Я вызываю clearFragments(); addFragment (новый A, false);
Проблема заключается в том, что B-фрагмент onCreateView
вызывается после нажатия кнопки на фрагменте C, который очищает фрагменты и добавляет фрагмент. Я не вижу фрагмент, но он начинает фоновый поток, который разбивает мое приложение. Мне нужно очистить все фрагменты, не называя их методы onCreateView()
.
Это ожидаемое поведение, или я делаю что-то неправильно?
Как очистить все фрагменты, не возвращаясь к первому сохраненному состоянию, поэтому в приложении я увижу пустое пространство, где находится R.id.main_frame? – SMart
Вы можете сделать addToBackStack для первого фрагмента - A. Вместо addFragment (новый A(), false) -> addFragment (новый A(), true). Итак, ваше первое состояние будет пустым контейнером. – Ayzen
Если вы хотите сохранить свой задний стек, вы можете просто удалить все фрагменты вручную. – Ayzen