【问题标题】:DialogFragment not dismissingDialogFragment 不关闭
【发布时间】:2012-06-26 17:00:55
【问题描述】:

我已经四处寻找解决方案,但似乎这不是一个常见问题。

我希望在我的应用程序连接到服务器时有一个不确定的对话框微调器,然后清除该对话框并在请求完成时显示不同的对话框。我正在使用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() 时第一个对话框尚未创建或附加。

任何提示都会非常有帮助。

【问题讨论】:

标签: android android-fragments


【解决方案1】:

我正在寻找的是

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)

【讨论】:

    【解决方案2】:

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

    编辑:由于您使用的 DialogFragments 可以通过显示和关闭自行管理事务,因此您应该改用它。

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

    【讨论】:

    • 来自 DialogFragment.show(FragmentTransaction, String) 的 Android 文档:“显示对话框,使用现有事务添加片段,然后提交事务。”在我看来,show() 为我提交了事务。
    • 是的,你是对的。当您回复时,我在已发布的答案中添加了另一个想法。
    • 在 Dialog 本身上调用 dismiss() 对其他人不起作用,其他 SO 帖子的一般感觉是在 DialogFragment 上调用dismiss() 更好。这就是我正在为我的警报 DialogFragments 做的事情,但不确定的微调器需要在何时被解雇时得到通知。如果在 getSupportFragmentManager().findFragmentByTag("dialog"); 时无法处理 Fragment,您如何建议我这样做?是否返回 null?
    • 首先,您可以为这两个不同的对话框分配单独的标签,这样您就可以将它们区分开来并检索和关闭正确的对话框。或者,您可以保留对这些片段的引用。或者您可以在微调器对话框可见后启动服务器通信 (DialogFragment.onStart)
    • 我喜欢在对话框可见后启动服务器通信的想法。我正在努力获取 getSupportFragmentManager().findFragmentByTag("dialog");目前返回 null 以外的任何内容...
    猜你喜欢
    • 2013-07-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2014-07-31
    • 2012-06-27
    • 2021-04-11
    • 1970-01-01
    相关资源
    最近更新 更多