在后台运行应用程序时关闭DialogFragment的正确方法


69

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

我有AsyncTask显示进度DialogFragment并将其关闭onPostExecute。一切正常,除非在onPostExecute应用程序在后台运行时发生(例如,按“主页”按钮后)。然后我在DialogFragment关闭时遇到了这个错误-“ Can not perform this action after onSaveInstanceState”。h 常规对话框可以正常工作。但不是FragmentDialog。

所以我想知道,当应用程序在后台时关闭DialogFragment的正确方法是什么?我并没有真正使用Fragments,所以我认为我只是缺少一些东西。


另请参见此处以了解使用暂停处理程序的不错解决方案
PJL 2012年

Answers:



10

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

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

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

当您想取消对话框时,请进行以下检查:

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

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

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

这样,如果该对话框是可见的,则该对话框将被关闭。如果该对话框不可见,则该片段将在下一个可见的片段上消失(onResume)...


当用户返回时,这总是消除该片段,如果他们还没有阅读该对话框,而是在显示该对话框之后立即离开该应用程序呢?
TWiStErRob

dismiss()已经在内部删除对话框片段。源代码:getFragmentManager().beginTransaction(); ft.remove(this);
瑞安·阿玛拉尔

3

这是实现您想要的目标所要做的:我有一个Fragment活动,在该活动上显示了一个名为Windows的对话框片段fragment_RedemptionPayment,该片段在全局顶部声明。以下代码消除了DialogFragment在活动进入后台并返回到前景之前显示的。

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

0

可能Fragment.setRetainInstance(true)在您的对话框片段中设置了一个可行的解决方案,但这并不是最漂亮的修复程序。

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

我常常最终使用一个单独的片段,它retaininstance(true)具有ResultReceiver。因此,我将该结果接收器传递给我的工作,并在其onReceive(通常作为其他接收器的路由器)中处理回调。但是,如果您使用异步任务,那可能比值得的工作还要多。


0

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

if(!dialog.isStateSaved){
    dialog.dismiss()
} else {
    //Change the UI to suit your functionality
}

通过这种方式,基本上在暂停和 onSaveInstanceState已被调用。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.