Android 在应用程序处于后台时关闭DialogFragment的正确方法

Android 在应用程序处于后台时关闭DialogFragment的正确方法,android,android-fragments,android-dialog,android-dialogfragment,Android,Android Fragments,Android Dialog,Android Dialogfragment,我开始使用DialogFragment,因为它们在方向改变等方面工作得很好。但我遇到了一个棘手的问题 我有一个AsyncTask,它显示进度对话框片段,并在postExecute上取消它。除了在应用程序处于后台时发生onPostExecute(例如,在按下Home按钮后),所有操作都正常。然后,我在DialogFragment dismissing上遇到了这个错误-“无法在onSaveInstanceState之后执行此操作。”。Doh。常规对话框工作正常。但不是零碎的对话 所以我想知道,当应用

我开始使用DialogFragment,因为它们在方向改变等方面工作得很好。但我遇到了一个棘手的问题

我有一个
AsyncTask
,它显示进度对话框片段,并在postExecute上取消它。除了在应用程序处于后台时发生
onPostExecute
(例如,在按下Home按钮后),所有操作都正常。然后,我在DialogFragment dismissing上遇到了这个错误-“
无法在onSaveInstanceState之后执行此操作。”。Doh。常规对话框工作正常。但不是零碎的对话


所以我想知道,当应用程序在后台时,什么是解除DialogFragment的正确方法?我并没有经常使用片段,所以我想我只是缺少了一些东西。

一个可能有效的解决方案是在您的dialogfragment中设置
Fragment.setRetainInstance(true)
,但这不是最漂亮的修复方法

有时我注意到,我必须将对话框操作排队,以便让框架首先恢复状态。如果您可以获得当前循环器
(Activity.getMainLooper())
,并将其包装在处理程序中,则可以尝试通过在该队列上发布runnable将您的解雇传递到队列的后面


我经常使用一个单独的片段,它
restaininstance(true)
有一个
ResultReceiver
。因此,我将结果接收器传递给我的作业,并在其onReceive中处理回调(通常作为其他接收器的路由器)。但是,如果您使用异步任务,那么这可能会比它的价值多一点。

DialogFragment
有一个名为dismissAllowingStateLoss()的方法。
这就是我所做的
(df==DialogFragment)

确保按以下方式调用该对话框:

df.show(getFragmentManager(), "DialogFragment_FLAG");
当您要关闭对话框时,请进行以下检查:

if (df.isResumed()){
  df.dismiss();
}
return;
确保片段(不是df)的onResume()方法中包含以下内容


这样,如果对话框可见,它将被取消。。如果不可见,对话框将被取消,接下来片段将可见(onResume).

这就是我要做的,以实现您想要的: 我有一个片段活动,在上面我显示了一个名为
Fragment\u RedemptionPayment
的对话框片段,它在顶部全局声明。如果在活动进入后台并返回前台之前显示,
对话框片段
,则以下代码将取消该对话框片段

     @Override
        public void onResume() {
            super.onResume();        
            if(fragment_RedemptionPayment.isVisible()){
                fragment_RedemptionPayment.dismiss();
            }
}

在调用Disclose之前检查状态的另一种新方法是:

if(!dialog.isStateSaved){
    dialog.dismiss()
} else {
    //Change the UI to suit your functionality
}
通过这种方式,检查其状态是否保存,基本上是在暂停时,并且调用了
onSaveInstanceState


对于Java,您可以使用
isStateSaved()

另请参阅使用暂停手柄的良好解决方案。当用户返回时,该方法始终会删除该片段,如果他们还没有阅读该对话框,则在显示该对话框后立即离开该应用程序会怎么样?
disease()
已在内部删除该对话框片段。源代码:
getFragmentManager().beginTransaction();移走(这个)
这仅在使用时有效,但在使用时无效,因为
dismissioninternal
中的
popbackbackstack
调用
enqueueAction(…,allowStateLoss=false)
即使我们要求允许状态丢失。它在框架和支持版本中都可以做到这一点。
if(!dialog.isStateSaved){
    dialog.dismiss()
} else {
    //Change the UI to suit your functionality
}