android - DialogFragment与addToBackstack方法连接

标签 android fragment dialogfragment

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

据我所知,有两种常见的显示 DialogFragment 的方法。通过 show() 方法或通过事务正常添加 fragment (从本质上是 show() 在内部执行的检查)。

我遇到的问题是理解 addToBackstack() 方法在整个过程中的位置,特别是当您在调用 show() 方法之前将事务添加到后台堆栈时,如本例所示:

// 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() 方法有什么区别。我刚刚检查了一个测试项目,其中连续显示多个 DialogFragment,DialogFragment 的内部实现自动处理所有内容,这意味着当我触摸后退按钮时,仍然会显示前一个 DialogFragment。

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

最佳答案

好吧,在使用 DialogFragment 解决方案编写更多代码(包括更多测试)之后,我找到了为什么要使用 addToBackStack 方法的原因(很可能是关键原因),就在删除之前的对话框之后。

这样做的原因(愚蠢的我,我错过了)是它会确保在一个时间点只有一个对话框是可见的。 show() 方法完全按照它说的去做,它“显示”了一个新的对话框 fragment ,但对任何以前的可见对话框绝对没有任何作用,所以本质上所有使用 show() 方法的对话框都将堆叠在前一个对话框的顶部.我的错误是,直到我制作了不同大小的对话框后,我才意识到这一点。如果所有对话框的大小都相同,那么最上面的对话框将隐藏所有其他对话框。

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

关于android - DialogFragment与addToBackstack方法连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27189826/

相关文章:

Android DialogFragment - 使用 onCreateView 并向对话框添加对话框按钮可能吗?

android - 如何设置 fragment 对话框大小以换行到 ListView

Java/Android 获取父实例调用方法

android - Cross Walk XWalkView 的父类(super class) Views 方法没有被调用。例如onScrollChanged

android - 如何在约束布局内的循环中插入动态生成的 TextView ?

android - Xamarin Android fragment ZXing - ClassCastException

android - 如何更改PreferenceFragment样式/主题?

java - Android处理显示

android - 如果我可以使用 android :configChanges ="keyboard|orientation|screenLayout",为什么还需要 setRetainInstance 或 onSaveInstance

android - 没有 FragmentActivity 的 DialogFragment