当应用程序在后台时正确的解除DialogFragment的方法

我开始使用DialogFragment,因为他们通过改变方向和东西很好地工作。 但是我遇到了一个很讨厌的问题。

我有AsyncTask显示进度DialogFragment并closuresonPostExecute 。 一切工作正常,除非当应用程序在后台(例如按下主屏幕button后) onPostExecute时发生。 然后,我得到了DialogFragment消失的这个错误 – “ Can not perform this action after onSaveInstanceState ”。 卫生署。 定期的对话框工作得很好。 但不是FragmentDialog。

所以我想知道,当应用程序在后台时解除DialogFragment的正确方法是什么? 我还没有真正与Fragments合作过,所以我觉得我只是错过了一些东西。

DialogFragment有一个名为dismissAllowingStateLoss()的方法

这就是我做的(df == dialogFragment)

确保你以这种方式调用对话框:

 df.show(getFragmentManager(),"DialogFragment_FLAG"); 

如果您想要拒绝对话,请进行以下检查:

 if(df.isResumed()){ df.dismiss(); } return; 

确保你的片段的onResume()方法中有以下内容(而不是df)

 @Override public void onResume(){ Fragment f= getFragmentManager().findFragmentByTag("DialogFragment_FLAG"); if (f!= null) { DialogFragment df = (DialogFragment) f; df.dismiss(); getFragmentManager().beginTransaction().remove(f).commit(); } super.onResume(); } 

这样,如果对话框可见,则该对话框将被取消。如果不可见,则在该对话框将被取消之后该片段变得可见(onResume)…

这是我必须做的,以达到你想要的:我有一个片段的活动,我正在显示一个对话框片段名为fragment_RedemptionPayment这是全球顶部宣布。 如果在活动进入后台并返回到前台之前显示DialogFragment则以下代码将被DialogFragment

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

一个解决scheme可能会工作是在对话框中设置Fragment.setRetainInstance(true) ,但这不是最好的修复。

有时我注意到我必须排队我的对话动作,让框架先恢复状态。 如果您可以获得当前的Looper (Activity.getMainLooper())并将其包装在Handler中,则可以尝试通过在该队列上发布可运行队列将您的解雇传递到队列的后面。

我经常最终使用一个独立的片段,它retaininstance(true)了具有ResultReceiver retaininstance(true) 。 所以我把这个结果接收器传递给我的工作,并在onReceive中处理callback(通常作为其他接收器的路由器)。 但是,如果您使用asynchronous任务,那可能会更有价值。