当从DialogFragment导航到另一个片段时,DialogFragment会关闭。

10

目前我的导航图中包含一个对话框碎片目标(Fragment(dialog)类型)。当我从该对话框导航到另一个碎片目标时,对话框会关闭,这在我看来是不可预测的行为。

现在我只能像这样导航到下一个碎片。

findNavController().popBackStack(R.id.testFragment, true)

我希望对话框不关闭,只导航到另一个对话框,就像默认的碎片一样。我该如何实现这个功能?


1
在我看来,从一个对话框导航到另一个对话框时自动关闭前一个对话框是“正确”的行为。在我看来,将对话框堆叠在一起不是一个好的用户体验设计。 - MatPag
1个回答

11
根据此问题,这是按预期工作的:
这里涉及到Dialogs和Fragments如何工作的一些问题:
  1. 对话框是独立的窗口,总是位于您的活动窗口上方。这意味着无论底层FragmentManager处于什么状态或者进行了哪些FragmentTransactions,对话框都将继续拦截系统返回按钮。
  2. 对片段容器(即您正常的<fragment>目标)的操作不会影响对话框片段。如果在嵌套的FragmentManager上执行FragmentTransactions也是一样。
导航的支持的最初版本没有考虑到这些限制,并且会像任何其他目标一样处理对话框目标,在导航的视图中,它们可以被放置在后退堆栈中并像任何其他目标一样处理。 由于实际情况并非如此,我们在Navigation 2.1.0-alpha06中进行了一些更改,以确保Navigation的世界状态与您在屏幕上看到的实际情况相匹配,并防止像评论#5中那样的崩溃。 这个总结是:当导航到一个非对话框和非活动目标(例如一个<fragment>目标)时,目标现在会自动弹出。为了参考,这是在https://android-review.googlesource.com/996359https://android-review.googlesource.com/1007662中完成的。
当您导航到非对话框目的地时,预计任何对话框目的地都会从后退栈中弹出。

有什么解决办法吗?我正在使用BottomSheetDialogFragment,希望能够通过返回按钮或向上导航返回到它。 - Smalls
@Smalls - 不,这个底层限制适用于所有对话框,无论是底部表单还是其他类型。 - ianhanniballake
糟糕。我们最终需要创建一个没有ActionBar/AppBar的新Activity,并在该Activity内部具有完整的流程来解决这个问题。我们放弃了BottomSheetDialogFragment,改为在Fragment内使用自定义布局。我们寻找的用例是BottomSheetDialogFragment弹出,并在其中单击某个内容以启动一系列没有ActionBar的屏幕。用户可以返回到底部工作表。完成(或退出)该流程后,我们需要将用户带回最初来自的位置。 - Smalls
@Smalls,您可以再次从最初显示它的相同片段中显示对话框。 - Abhinav Chauhan
解决方案是先尝试导航,然后再显示对话框片段,否则对话框将会消失。 - takharsh
解决方法是先尝试导航,然后再显示对话框片段,否则对话框会消失。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接