2014-11-19 2 views
0

У меня есть DialogFragment, называют его A, который представляет собой вариант, который приводит ко второму DialogFragment, B, который отображается. B предоставляет дополнительные возможности.Предотвратите DialogFragment «A» появляясь, когда выбор сделан на DialogFragment «B»

Функциональности я требую заключается в следующий:

  1. сделать выбор в A приводит к B отображается (как указано выше).
  2. Если пользователь нажимает back, пока отображается B, A следует возобновить.
  3. Если пользователь делает выбор в B, то B должен уволить и A не должен появляться повторно.

В A, внутри onItemClick() обработчика вызываю B появляться с помощью:

FragmentManager manager = getActivity().getSupportFragmentManager(); 
FragmentTransaction transaction = manager.beginTransaction(); 
transaction.remove(DialogFragmentA.this); 
transaction.addToBackStack("transaction_label"); 
DialogFragmentB dialogFragment = DialogFragmentB.newInstance(...some args here...); 
dialogFragment.show(transaction, "frag_B"); 

Я называю .addToBackStack(), как я понимаю, это приведет к тому, ключ back совать и отменить транзакцию. То есть, замените B на A.

До сих пор выполнялись требования 1 и 2.

B использует AlertDialog.Builder. Для слушателя используется положительная кнопка. Когда эта положительная кнопка нажата, я хочу выполнить требование 3. То есть B должен отклоняться и A не должен появляться снова. Но то, что на самом деле происходит, - A.

Я предполагаю, что в реализации положительной кнопки AlertDialog есть вызов dismiss(), который вызывает выпадение назад стека, в результате чего снова появляется A. Это так?

То, что я постарался сделать, состоит в том, что в положительной кнопке onClick() необходимо получить FragmentManager и позвонить по телефону .popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE). Но это не имеет никакого видимого эффекта; A продолжает появляться. Использование popBackStackImmediate() также не имеет эффекта.

Возможно, это связано с тем, что цикл событий уже каким-то образом совершил попытку выскочить обратно-стек к тому времени, когда выполняется функция onClick() положительной кнопки?

Буду благодарен за объяснение происходящего и то, как я могу заставить его работать должным образом.

ответ

0

Я думаю, что я прибил его, помог question and answer here.

Ключевым моментом является то, что последовательность транзакций равна nothing ->A ->B. Я хочу поместить задний стек в точку, где у меня есть nothing. Поэтому, а также созвать .addToBackStack() для транзакции A ->B, мне также необходимо позвонить .addToBackStack() за транзакцию nothing ->A.Затем все эти транзакции можно снова вытащить из заднего стека, чтобы вернуться к точке ничего: первый поп делает B ->A, затем следующий поп A ->nothing.

Для обеих транзакций я теперь звоню .addToBackStack("some_transaction"). В B положительный onClick(), я звоню manager.popBackStack("some_transaction", FragmentManager.POP_BACK_STACK_INCLUSIVE);. Я могу пересмотреть теги, которые я передаю транзакциям, но теперь это работает так, как я хочу.

Так базовая точка, кажется, что, если вы хотите, чтобы это было возможно пойти back к DialogFragment, но и вернуться к точке, где это DialogFragment не был показан на всех, вы должны добавить транзакцию, положите его туда, в первую очередь, на задний стек, чтобы вы могли вернуться к этой точке.

Я раньше думал, что можно было бы добиться того, что я хотел лишь добавив A - сделки>B в стек обратно, а затем каким-то образом полностью продувкой (а не выскакивают) задняя стека, чтобы предотвратить A снова появляются один раз в выбор был сделан в B. Но, похоже, нет никакого способа «очистить» задний стек; вы можете только всплывать и отменять транзакции.