Actions dans onActivityResult et «Erreur Impossible d’effectuer cette action après onSaveInstanceState»

La mise en œuvre d’une application où l’utilisateur peut se connecter a la situation suivante: Si l’utilisateur est connecté, exécutez l’action sinon démarrez l’activité de connexion pour le résultat et si le résultat est Activity.RESULT_OK effectuez l’action.

Mon problème est que l’action à effectuer consiste à afficher un DialogFragment, mais en appelant

DialogFragment newFragment = MyDialogFragment.newInstance(mStackLevel); newFragment.show(ft, "dialog") 

dans le rappel onActivityResult lève une exception:

 Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

Alors, comment puis-je résoudre ce problème? Je pense à lever un drapeau là-bas et montrer le dialog dans le onResume mais je vois cette solution un peu sale

Edit: Ajout de code supplémentaire (Im suivant cet exemple pour montrer le DialogFragment

Lorsque l’action est demandée par l’utilisateur:

 ... if (!user.isLogged()){ startActivityForResult(new Intent(cnt, Login.class), REQUEST_LOGIN_FOR_COMMENT); } 

Dans le même fragment

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_LOGIN_FOR_COMMENT && resultCode == Activity.RESULT_OK) { FragmentTransaction ft = getFragmentManager().beginTransaction(); DialogFragment newFragment = MyDialogFragment.newInstance(); newFragment.show(ft, "dialog") } } 

Et si l’utilisateur se connecte aux appels d’activité de connexion;

 setResult(Activity.RESULT_OK); finish(); 

La meilleure chose que j’ai faite est de ne pas utiliser .show () mais plutôt de le faire.

 CheckinSuccessDialog dialog = new CheckinSuccessDialog(); //dialog.show(getSupportFragmentManager(), null); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(dialog, null); ft.commitAllowingStateLoss(); 

Voici la solution qui fonctionne bien pour moi.

 private void alert(final Ssortingng message) { Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { public void run() { AlertDialogFragment alertDialogFragment = AlertDialogFragment.newInstance(message); alertDialogFragment.show(getFragmentManager(), ALERT_DIALOG_FRAGMENT); } }); } 

Si vous utilisez un DialogFragment, la seule chose qui a fonctionné pour moi a été de supprimer le fragment avec dissmissAllowingStateLoss ()

Je vérifie simplement si une activité est en train d’être détruite.

 if (!getActivity().isFinishing()) { DialogFragment fragment = MyFragment.newInstance(); fragment.show(getActivity().getSupportFragmentManager(), MyFragment.TAG); } 

Fonction Override show(Fragment manager, Ssortingng tag) permettant la perte de l’état et la modification de mDismissed = false; mShownByMe = true; de la fonction d’origine par reflection:

 public class DialogParent extends DialogFragment { @Override public void show(FragmentManager manager, Ssortingng tag) { try { Field mDismissed = DialogFragment.class.getDeclaredField("mDismissed"); Field mShownByMe = DialogFragment.class.getDeclaredField("mShownByMe"); mDismissed.setAccessible(true); mShownByMe.setAccessible(true); mDismissed.setBoolean(this, false); mShownByMe.setBoolean(this, true); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } FragmentTransaction ft = manager.beginTransaction(); ft.add(this, tag); ft.commitAllowingStateLoss(); } } 

Ce vrai travaille.

 CheckinSuccessDialog dialog = new CheckinSuccessDialog(); //dialog.show(getSupportFragmentManager(), null); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(dialog, null); ft.commitAllowingStateLoss(); 

Mais mais toujours aussi mauvais, car une erreur est survenue «L’activité a été détruite»

 ava.lang.IllegalStateException: Activity has been destroyed fragmentTransaction.commitAllowingStateLoss(); 

Donc, ma solution est de vérifier if (!isFinishing()&&!isDestroyed())

 CheckinSuccessDialog fragment = CheckinSuccessDialog.newInstance(); if (fragment instanceof DialogFragment) { DialogFragment dialog = (DialogFragment) fragment; if (!dialog.isAdded()) { fragmentTransaction.add(dialog, CheckinSuccessDialog.class.getName()); if (!isFinishing()&&!isDestroyed()) { fragmentTransaction.commitAllowingStateLoss(); } } 

sur rejet:

 FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); Fragment fragment = getSupportFragmentManager().findFragmentByTag(CheckinSuccessDialog.class.getName()); if (fragment != null && fragment instanceof DialogFragment) { DialogFragment dialog = (DialogFragment) fragment; dialog.dismiss(); if (!isFinishing()&&!isDestroyed()) { fragmentTransaction.commitAllowingStateLoss(); } } 

Cette exception est levée chaque fois qu’une FragmentTrasaction est validée après que FragmentManager a enregistré son état. La manière simple et propre est de vérifier si FragmentManager a déjà enregistré l’état avant d’afficher un DialogFragment .

 if(!getSupportFragmentManager.isStateSaved()) { MyDialogFragment dialogFragment = new MyDialogFragment() dialogFragment.show(getSupportFragmentManager, TAG); }