DialogFragment没有解雇

时间:2012-06-26 06:51:38

标签: android android-fragments

我一直在寻找解决方案,但似乎这不是一个常见的问题。

当我的应用程序连接到服务器然后清除该对话框并在请求完成时显示不同的对话框时,我希望有一个不确定的对话框微调器。我正在使用Fragment兼容包。问题是在显示第二个对话框之前没有删除微调器。

这是我的代码,显示对话框,并应删除任何当前对话框:

void displayDialog(int type, String message) {
    Log.i(logTag, "displayDialog: " + type);
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
    if (prev != null) {
        Log.i(logTag, "removing previous dialog");
        ft.remove(prev); //TODO maybe use ((DialogFragment)dialog).dismiss(); ?
    }
    ft.addToBackStack(null);

    // Create and show the dialog.
    DialogFragment newFragment = DialogHelperFragment.newInstance(type, message);
    newFragment.show(ft, "dialog");
}

以下是我用来解决此错误的调​​用代码:

displayDialog(DialogHelperFragment.DIALOG_PROGRESS, null);
displayDialog(DialogHelperFragment.DIALOG_PURCHASE_SUCCESS, null);

这是我对应的LogCat输出:

06-25 13:53:35.497: I/tag(11008): displayDialog: 8
06-25 13:53:35.497: I/tag(11008): displayDialog: 7
06-25 13:53:35.897: I/tag Dialog Helper(11008): Creating Dialog: 8
06-25 13:53:35.907: I/tag Dialog Helper(11008): Creating Dialog: 7

问题在于

Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");

返回null,因为再次调用displayDialog()时尚未创建或附加第一个对话框。

任何提示都会非常有用。

2 个答案:

答案 0 :(得分:6)

我在寻找的是

getSupportFragmentManager().executePendingTransactions()

如图here所示。似乎交易并不急于通过。这个电话促使交易通过。我的交易顺序如下:

06-26 10:45:43.800: I/tag(3303): displayDialog: 8
06-26 10:45:43.800: I/tag(3303): Previous Dialog Fragment is:null
06-26 10:45:43.810: I/tag(3303): displayDialog: 7
06-26 10:45:43.810: I/tag(3303): Previous Dialog Fragment is:DialogHelperFragment{40b44a78 #0 dialogHelp}
06-26 10:45:43.810: I/tag(3303): removing previous dialog
06-26 10:45:44.220: I/tag Dialog Helper(3303): Creating Dialog: 7

所以在实际创建对话框类型8之前将其删除。

我希望这对那些陷入同样问题的人有所帮助。

修改

似乎我还必须删除addToBackStack(null)

答案 1 :(得分:1)

抱歉,我并没有真正深入研究您的代码,但我找不到您的FragmentTransaction上的“commit”调用。您最终需要提交这些交易。

编辑:由于您使用的是DialogFragments,它可以通过show和dismiss自行管理交易,您应该使用它来代替。

你需要在Fragment的Dialog对象上调用dismiss。