2014-09-14 2 views
1

у меня есть эти методы для манипулирования фрагмента: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().

Это ожидаемое поведение, или я делаю что-то неправильно?

ответ

1

На самом деле в таком случае вы всегда будете возвращаться к фрагменту Б.

Шаг за шагом:

  1. Добавление А.
  2. Заменяя А с B < - после этого шага вы не» т А в вашей деятельности.
  3. Добавление C. Здесь вы добавляете еще один фрагмент и сообщаете FragmentManager, чтобы сохранить текущее состояние фрагментов в фоновом стеке. Ваше текущее состояние в этой точке - фрагмент B. Затем добавляется фрагмент C.
  4. Когда вы звоните clearFragments, FragmentManager возвращается в первое сохраненное состояние - и это состояние представляет собой фрагмент B.

Может быть, вы забыли упомянуть что-то? Я попытался поместить несколько записей в задний стек, а затем сбрасывать в первое состояние - onCreateView вызывается один раз, только для первого фрагмента.

+0

Как очистить все фрагменты, не возвращаясь к первому сохраненному состоянию, поэтому в приложении я увижу пустое пространство, где находится R.id.main_frame? – SMart

+0

Вы можете сделать addToBackStack для первого фрагмента - A. Вместо addFragment (новый A(), false) -> addFragment (новый A(), true). Итак, ваше первое состояние будет пустым контейнером. – Ayzen

+0

Если вы хотите сохранить свой задний стек, вы можете просто удалить все фрагменты вручную. – Ayzen

Смежные вопросы