Проблема с Android BackStack

У меня возникли проблемы с решением проблемы с BackStack. У меня есть 3 фрагмента, которыми управляет Activity:

введите здесь описание изображения

Для навигации между фрагментами я использую этот код:

private void showFragment(BabysitFragment babysitFragment, UserRequest userRequest) {
   FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
   switch (babysitFragment) {
      case CHILDREN_OVERVIEW:
        toolbar.setVisibility(View.VISIBLE);
        Fragment childrenSpecification = ChildrenOverviewFragment.newInstance(userRequest);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.replace(R.id.fragment_container, childrenSpecification, BabysitFragment.CHILDREN_OVERVIEW.getSimpleName()).commit();
        break;
      case CHILD_SPECIFICATION:
        toolbar.setVisibility(View.VISIBLE);
        Fragment childSpecification = ChildSpecificationFragment.newInstance(userRequest);
        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.replace(R.id.fragment_container, childSpecification, BabysitFragment.CHILD_SPECIFICATION.getSimpleName()).commit();
        break;
   }
}

//Gets called by FinalizeFrag and ChildSpecificationFrag
@Override
public void onChildrenOverviewNeeded(UserRequest userRequest) {
    showFragment(BabysitFragment.CHILDREN_OVERVIEW, userRequest);
}

//Gets called by ChildrenOverviewFrag
@Override
public void onChildSpecificationNeeded(UserRequest userRequest) {
    showFragment(BabysitFragment.CHILD_SPECIFICATION, userRequest);
}

Я хочу, чтобы пользователь мог вернуться к FinalizeFrag, используя кнопку возврата из двух других фрагментов. Это работает с текущим кодом, но в 1 потоке у меня есть проблема:

  1. Пользователи сохраняют новый «дочерний элемент» в ChildSpecificationFrag (значок сохранения на панели инструментов).
  2. Пользователь перенаправляется на ChildrenOverviewFrag
  3. Пользователь нажимает кнопку «Назад»
  4. Остается на ChildrenOverviewFrag (СЛЕДУЕТ перенаправлять на FinalizeFrag)

ПРИМЕЧАНИЕ. Когда я снова нажимаю кнопку, она перенаправляется на FinalizeFrag.

Код при нажатии кнопки закрытия (ChildSpecificationFragment):

if (id == android.R.id.home) {
  getActivity().onBackPressed();
}

Код при нажатии кнопки сохранения (ChildSpecificationFragment):

...
userRequest.getFamilyDetails().getChildren().add(child);
getActivity().getSupportFragmentManager().popBackStackImmediate();
onChildrenOverviewNeededListener.onChildrenOverviewNeeded(userRequest, this);

Как видите, я удаляю фрагмент из BackStack. Что я делаю неправильно? Заранее спасибо!


person Jdruwe    schedule 04.07.2015    source источник


Ответы (2)


Не вызывайте addToBackStack, прежде чем сделать «Пользователь перенаправляется на ChildrenOverviewFrag»,

person Green goblin    schedule 04.07.2015
comment
В случае CHILDREN_OVERVIEW или CHILD_SPECIFICATION? Можете ли вы также объяснить, почему? Спасибо! - person Jdruwe; 04.07.2015
comment
Попробуйте оба. Пожалуйста, дайте мне знать, если это работает. Я использовал его давно, и это действительно работало для меня. - person Green goblin; 04.07.2015
comment
Я заменил его на «fragmentTransaction.addToBackStack(scheduleFragment);» в обоих случаях, но мне все равно нужно дважды щелкнуть назад в ChildrenOverviewFrag, чтобы вернуться к FinalizeFrag. - person Jdruwe; 04.07.2015
comment
Похоже, onbackstackchangedlistener может решить вашу проблему - person Green goblin; 04.07.2015
comment
И как это помогает? - person Jdruwe; 04.07.2015
comment
Кстати, где вы совершаете транзакцию фрагмента? - person Green goblin; 04.07.2015
comment
В конце строки fragmentTransaction.replace(...).commit(). - person Jdruwe; 04.07.2015
comment
Я понимаю. Прежде чем пользователь будет перенаправлен на ChildrenOverviewFrag, не вызывайте addToBackStack - person Green goblin; 04.07.2015
comment
Кажется, это работает, но теперь содержимое ChildrenOverviewFrag отображается под FinalizeFrag следующим образом: imgur.com/yZlpFC6. Должен ли я каким-то образом удалить ChildrenOverviewFrag? - person Jdruwe; 04.07.2015
comment
да. Вам нужно переопределить onbackstackchangedlistener и когда вы вернетесь в FinalyzeFrag, вам нужно удалить содержимое ChildrenOverviewFrag - person Green goblin; 04.07.2015
comment
Я все еще не уверен, как вы хотите, чтобы onbackstackchangedlistener выглядел? Может быть, вы можете привести пример кода? - person Jdruwe; 04.07.2015
comment
См. это: stackoverflow.com/questions/23599519/ - person Green goblin; 04.07.2015
comment
Как узнать, что я перехожу от ChildrenOverviewFrag к FinalyzeFrag? Извините за все эти вопросы :С - person Jdruwe; 04.07.2015
comment
Я думаю, что getBackStackEntryCount() можно использовать, чтобы определить, где вы находитесь. Когда вы вернетесь к finalyzeFrag, можно ли здесь использовать обратный счетчик записей в стеке? - person Green goblin; 04.07.2015
comment
Вы также можете управлять вещами в onResume finalyzeFrag. См. здесь, как принудительно вызвать onResume фрагмента: stackoverflow .com/questions/6503189/ - person Green goblin; 04.07.2015
comment
Считайте это 1 в обеих ситуациях: от доработки к обзору, от спецификации к обзору. Поэтому мне кажется невозможным знать, когда очищать. - person Jdruwe; 04.07.2015
comment
Вздох! Я могу придумать еще один подход, хотя это своего рода взлом. Используйте SharedPreferences и записывайте в него значение всякий раз, когда пользователь сохраняет дочерний элемент. Таким образом, вы знаете, что когда обрабатывать после проверки содержимого файла SharedPreferences. Как только вы справитесь с этим, очистите значение SharedPreferences, чтобы его можно было использовать в следующий раз, когда пользователь сохранит новый дочерний элемент. - person Green goblin; 04.07.2015
comment
И когда, по-твоему, я читаю настройки и очищаю контейнер? - person Jdruwe; 04.07.2015
comment
Внутри метода onBackStackChanged - person Green goblin; 04.07.2015
comment
Я собираюсь попробовать кое-что, я полагаю, мне также нужно проверить, что я в настоящее время отображаю FinalizeFrag. - person Jdruwe; 04.07.2015
comment
Дайте мне знать, если вы застряли в какой-либо проблеме - person Green goblin; 04.07.2015
comment
Буду, спасибо за помощь! Решение SharedPreferences кажется немного хитрым, но я изучаю его. - person Jdruwe; 04.07.2015

я думаю

fragmentTransaction.addToBackStack(null); 

добавит фрагмент в задний стек.

public abstract boolean popBackStackImmediate (String name, int flags) 

просто возвращает true, если что-то выскочило, иначе false.

person sachithkn    schedule 04.07.2015
comment
Я не уверен, что вы имеете в виду, это то, что я нашел в документах: подобно popBackStack(), но выполняет операцию непосредственно внутри вызова. Это похоже на вызов executePendingTransactions() после этого. Возвращает true, если что-то выскочило, иначе false. Мне кажется, что появляется последний добавленный элемент. - person Jdruwe; 04.07.2015