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

Sve*_*ver 64 android android-fragments android-dialog android-dialogfragment

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

我有AsyncTask显示进度DialogFragment并解散它onPostExecute.一切正常,除非在onPostExecute应用程序处于后台时发生(例如,在按下Home按钮后).然后我在DialogFragment解雇时得到了这个错误 - " Can not perform this action after onSaveInstanceState".卫生署.常规对话框工作得很好.但不是FragmentDialog.

所以我想知道,在应用程序处于后台时,解雇DialogFragment的正确方法是什么?我没有真正使用Fragments,所以我认为我只是遗漏了一些东西.

Jia*_* Qi 139

DialogFragment 有一个叫做的方法 dismissAllowingStateLoss()

  • 这只适用于:[`show(FragmentManager,tag)`](http://developer.android.com/reference/android/app/DialogFragment.html#show(android.app.FragmentManager,%20java.lang) .string)),但不是在使用[`show(FragmentTransaction,tag)`]时(http://developer.android.com/reference/android/app/DialogFragment.html#show(android.app.FragmentTransaction,%20java) .lang.String))因为`dismissInternal`中的`popBackStack`调用`enqueueAction(...,allowStateLoss = false)`,即使我们要求允许状态丢失.它在框架和支持版本中都是这样做的. (14认同)

小智 10

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

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

df.show(getFragmentManager(), "DialogFragment_FLAG");
Run Code Online (Sandbox Code Playgroud)

当您要解除对话框时,请进行以下检查:

if (df.isResumed()){
  df.dismiss();
}
return;
Run Code Online (Sandbox Code Playgroud)

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

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

这样,如果对话框可见,则对话框将被解除..如果不可见则对话框将被删除,然后片段变为可见(onResume)...