Android 在应用程序处于后台时关闭DialogFragment的正确方法
我开始使用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。常规对话框工作正常。但不是零碎的对话 所以我想知道,当应用
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
}