防止DialogFragment' A'在DialogFragment' B'上进行选择时重新出现

时间:2014-11-19 23:30:22

标签: android fragment android-dialogfragment

我有一个DialogFragment,称之为A,它会显示一个选项,导致显示第二个DialogFragmentBB提供了更多选项。

我需要的功能如下:

  1. A中进行选择会显示B(如上所述)。
  2. 如果用户在显示back时点击B,则应恢复A
  3. 如果用户在B中进行了选择,那么B应该被忽略,A不应该重新出现。
  4. 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}}执行时弹出后台堆栈?

    我很感激能够解释正在发生的事情以及如何使其按预期运作。

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。但似乎没有办法实际清除'后堆;你只能弹出和反转交易。