DialogFragment和addToBackStack方法的联系

4

DialogFragment的与BackStack的组合让我感到困惑,希望有人能帮助我。

根据我所了解的,有两种常见的显示DialogFragment的方法。一种是通过show()方法,另一种是通过普通添加事务来添加片段(从检查中,这实际上是show()在内部执行的操作)。

我的问题在于理解addToBackstack()方法在整个过程中的作用,特别是在调用show()方法之前将事务添加到backstack中时,例如在此示例中:

// DialogFragment.show() will take care of adding the fragment
// in a transaction.  We also want to remove any currently showing
// dialog, so make our own transaction and take care of that here.
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
    ft.remove(prev);
}
ft.addToBackStack(null);

// Create and show the dialog.
DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel);
newFragment.show(ft, "dialog");

在上面的示例中,在显示新的DialogFragment之前,我们检查是否有其他可显示的DialogFragment,将其删除并将此过程添加到后退栈中(我假设这是为了在删除新的DialogFragment时显示先前的DialogFragment)。然后,我们通过show()方法显示新的DialogFragment。但我没有看到这种方法与仅调用show()方法之间的任何区别。我在测试项目中检查了一下,按顺序显示多个DialogFragments时,DialogFragment的内部实现会自动处理一切,这意味着当我触摸返回按钮时,先前的DialogFragment仍然会被显示。

那么,为什么在DialogFragments的上下文中使用addToBackStack呢?

1个回答

4
好的,通过使用DialogFragment方案编写更多代码并进行更多测试后,我找到了使用addToBackStack方法的原因(很可能是主要原因),就在移除先前对话框之后。
这样做的原因是(我太傻了,错过了这一点),它会确保每次只有一个对话框可见。show()方法正是它所说的,“显示”新的对话框片段,但不对任何以前可见的对话框进行任何操作,因此实际上,所有使用show()方法的对话框都将堆叠在上一个对话框上面。我的错误在于,在制作大小不同的对话框之前,我没有意识到这一点。如果所有对话框的大小都相同,则最上层的对话框将隐藏所有其他对话框。
因此,总结一下,show()方法不会隐藏/删除已经存在屏幕上的任何对话框。如果我们想这样做,我们需要手动进行事务,当然,必须包括删除先前对话框以及将此事务添加到返回堆栈中,以便用户按下返回按钮时,先前的对话框将重新出现。

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