我有一个DialogFragment
,称之为A
,它会显示一个选项,导致显示第二个DialogFragment
,B
。 B
提供了更多选项。
我需要的功能如下:
A
中进行选择会显示B
(如上所述)。back
时点击B
,则应恢复A
。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
替换为B
。
到目前为止,要求1和2已得到满足。
AlertDialog.Builder
使用B
。正面按钮与监听器一起使用。当按下该正按钮时,我希望满足要求3。也就是说,A
应该解散,而A
不应该重新出现。但实际发生的事情是AlertDialog
再次出现。
我假设在dismiss()
的实施中,正面按钮是对A
的调用,导致后面的堆栈被弹出,导致出现onClick()
再次。是这种情况吗?
我尝试做的是,在正面按钮FragmentManager
内,获取.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
并致电A
。但这没有明显的效果; popBackStackImmediate()
继续出现。使用onClick()
也没有效果。
这可能是因为事件循环已经以某种方式承诺在正按钮监听器{{1}}执行时弹出后台堆栈?
我很感激能够解释正在发生的事情以及如何使其按预期运作。
答案 0 :(得分:0)
在question and answer here的帮助下,我认为我已经钉了它。
关键是交易顺序为nothing
- > A
- > B
。我想将后台堆栈弹到我nothing
的位置。因此,同时为.addToBackStack()
- >调用A
B
交易,我还需要为.addToBackStack()
- >致电nothing
A
交易。然后,所有这些交易都可以再次从后面的堆栈中弹出,以回到无关紧要的状态:第一个pop会执行B
- > A
,然后下一个广告素材A
- > nothing
。
对于这两个交易,我现在正在呼叫.addToBackStack("some_transaction")
。在B
的积极onClick()
中,我致电manager.popBackStack("some_transaction", FragmentManager.POP_BACK_STACK_INCLUSIVE);
。我可能会重新考虑我为交易提供的标签,但现在这种方式正如我所希望的那样。
所以基本点似乎是,如果你希望它可以back
转到DialogFragment
,但也要回到DialogFragment
没有&#39的地步; t显示,你必须将首先放在那里的事务添加到后台,这样你就可以回到那一点。
我以前认为只有添加A
- >就能实现我想要的效果。 B
事务到后栈,然后以某种方式完全清除(而不是弹出)后栈,以防止在A
中进行选择后再次出现B
。但似乎没有办法实际清除'后堆;你只能弹出和反转交易。