DialogFragment - ne Peut pas effectuer cette action après onSaveInstanceState

Je suis le développement d'un lanceur d'application qui montre une dialogfragment lorsque l'utilisateur s'authentifie lui-même. La plupart du temps cela fonctionne bien, mais parfois, je vais avoir ce journal des erreurs:

02-07 18:55:56.619: E/AndroidRuntime(1300): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1280)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1291)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.BackStackRecord.commitInternal(BackStackRecord.java:548)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.BackStackRecord.commit(BackStackRecord.java:532)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.DialogFragment.dismissInternal(DialogFragment.java:292)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.DialogFragment.dismiss(DialogFragment.java:258)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.blablabla.android.app.fragments.login.LoginResultFragment$CloseDialogRunnable.run(LoginResultFragment.java:59)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Handler.handleCallback(Handler.java:615)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.os.Looper.loop(Looper.java:137)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at android.app.ActivityThread.main(ActivityThread.java:4745)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at java.lang.reflect.Method.invokeNative(Native Method)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at java.lang.reflect.Method.invoke(Method.java:511)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-07 18:55:56.619: E/AndroidRuntime(1300):     at dalvik.system.NativeStart.main(Native Method)

J'ai cherché dans d'autres threads, pour exemple et de suivi de leurs suggestions, mais ça ne marche toujours pas pour moi

Mon dialogfragment ressemble:

public class LoginResultFragment extends DialogFragment implements
OnClickListener {
private CloseDialogRunnable runnable = null;
public class CloseDialogRunnable implements Runnable {
/**
* https://stackoverflow.com/questions/5844308/removecallbacks-not-
* stopping-runnable
*/
private boolean killCloseActivityRunnable = false;
public void killRunnable() {
killCloseActivityRunnable = true;
}
@Override
public void run() {
if (killCloseActivityRunnable) {
return;
}
if (getDialog()!=null && getDialog().isShowing()) {             
dismiss();              
}
}
}
@Override
public void onDismiss(DialogInterface dialog) {
if (runnable != null){      
runnable.killRunnable();
handler.removeCallbacks(runnable);
}
super.onDismiss(dialog);
}
/** Milliseconds until we dismiss the timeout */
private static final long DISMISSING_TIMEOUT = 2000;
/** Dismissing window handler */
private final Handler handler = new Handler();
private LoginResultFragment() {
}
public static LoginResultFragment getInstance(
Map<String, Object> currentValues) {
LoginResultFragment result = new LoginResultFragment();
set extra fields...
return result;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(DialogFragment.STYLE_NO_FRAME,
android.R.style.Theme_Holo_Dialog);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setRetainInstance(true);
rootView = inflater.inflate(R.layout.fragment_login_result, container);
getDialog().getWindow().setBackgroundDrawable(
new ColorDrawable(android.graphics.Color.TRANSPARENT));
do UI stuff...
dismissAfterTimeout();
return rootView;
}
private void dismissAfterTimeout() {
runnable = new CloseDialogRunnable();
handler.postDelayed(runnable, DISMISSING_TIMEOUT);
}
@Override
public void onSaveInstanceState(Bundle outState) {
}
}

Et je l'appelle avec:

final android.app.FragmentTransaction trans = activity
.getFragmentManager().beginTransaction();
trans.add(fragment, fragment.getClass().getCanonicalName());
trans.commitAllowingStateLoss();
Pouvez-vous ajouter plus de détails autour de l'endroit où vous ne le FragmentTransaction? Je vois que vous ajoutez le fragment le gestionnaire de transactions, mais êtes-vous l'ajouter à la mise en page? Ce qui se passe à côté, qui pourrait le cas onSaveInstanceState() est appelé sur le Fragment (pause, terminer l'activité, etc.)?
Salut jacobhyphenated, merci pour votre commentaire. Je ne suis pas d'ajouter le fragment de la mise en page parce que je suis le montre comme une boîte de dialogue (c'est un DialogFragment). Je la montre quand je reçois des informations de connexion à partir d'autres processus.
double possible de Afficher DialogFragment de onActivityResult
J'ai fait une solution de rechange à DialogFragment, qui peuvent éviter cette exception : github.com/AndroidDeveloperLB/DialogShard

OriginalL'auteur Guillermo Merino | 2014-02-07