DialogFragment和addToBackstack方法连接

时间:2014-11-28 13:32:47

标签: android fragment dialogfragment

DialogFragment与BackStack的结合使我感到困惑,也许有人可以帮助我。

根据我的发现,有两种常见的方式来显示DialogFragment。要么通过show()方法,要么通过正常的方式通过事务添加片段(从必要的检查中看是什么show()internaly)。

我遇到的问题是了解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,我们将其删除并将此过程添加到backstack(我假设这是为了显示前一个DialogFragment,当新的DialogFragment已删除)。然后我们通过show()方法显示新的DialogFragment。但我没有看到这种方法之间的任何区别,只是调用show()方法。我刚刚检查了一个Test项目,并在一个接一个的顶部显示了多个DialogFragments,而DialogFragment的内部实现自动处理所有内容,这意味着当我触摸按钮时,仍会显示前一个DialogFragment。

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

1 个答案:

答案 0 :(得分:2)

好吧,在使用包含更多测试的DialogFragment解决方案编写更多代码之后,我找到了为什么在删除上一个对话框后立即使用addToBackStack方式的原因(很可能是关键原因)。

它的原因(愚蠢的我,我错过了)是它将确保在一个时间点只能看到一个对话框。 show()方法正如它所说的那样,它显示了#34;一个新的对话框片段,但对于之前的任何可见对话框都没有任何作用,因此实际上所有使用show()方法的对话框都将堆叠在上一个对话框的顶部。我的错误是我没有意识到这一点,直到我制作了不同大小的对话框。如果所有对话框的大小相同,那么最顶层的对话框将隐藏所有其他对话框。

总而言之,show()方法不会隐藏/删除屏幕上已存在的任何对话框。如果我们想要这样做,我们需要手动执行事务,这当然必须包括删除前一个对话框以及将此事务添加到后台堆栈,以便当用户按下后退按钮时,之前的对话框将重新出现