557 votes

IllegalStateException : Ne peut pas exécuter cette action après onSaveInstanceState - comment prévenir ?

Je reçois rapports des utilisateurs de mon application sur le marché, livrant l’exception suivante :

Apparemment, il a quelque chose à voir avec un FragmentManager, dont je n’utilise pas. Stacktrace n’affiche pas de mes propres cours, donc je n’ai aucune idée où cette exception se produit et comment le prévenir.

Pour mémoire : J’ai un tabhost et dans chaque onglet, il y a un ActivityGroup commutation entre les activités.

767voto

Ovidiu Latcu Points 20783

Veuillez vérifier ma réponse ici. Fondamentalement, j'ai juste eu à :

@Override
protected void onSaveInstanceState(Bundle outState) {
    //No call for super(). Bug on API Level > 11.
}

ne faites pas l'appel à l' super() sur le saveInstanceState méthode. C'était la pagaille...

EDIT: après quelques recherches, c'est un savoir bug dans le paquet de soutien.

Si vous avez besoin d'enregistrer l'instance, et d'ajouter quelque chose à votre outState Bundle vous pouvez utiliser les éléments suivants :

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
    super.onSaveInstanceState(outState);
}

EDIT2: en fin de compte la bonne solution était (comme vu dans les commentaires) à utiliser :

transaction.commitAllowingStateLoss();

lors de l'ajout ou de l'exécution de l' FragmentTransaction qui a été l'origine de l' Exception.

22voto

Jed Points 1170

Voici une autre solution à ce problème.

En utilisant une variable de membre privé, vous êtes en mesure de définir les données retournées comme une intention qui peut ensuite être traitée après super.onResume() ;

Comme suit :

21voto

Happy Vicky Points 761

Solution de courte et de travail :

Suivez les étapes simples

Mesures

Étape 1 : Substituer onSaveInstanceState État en fragment respectif. Et retirer le super méthode.

Etape 2 : Utilisez fragmentTransaction.commitAllowingStateLoss () ; que fragmentTransaction.commit () ; alors que les opérations de fragment.

``

10voto

saberrider Points 188

J’ai trouvé une solution utilisée pour ce genre de problème. Si vous voulez continuer à garder votre `` pour que ce soit raison (j’ai eu des raisons de limitation de temps), vous implémentez simplement

dans votre et faire un peu code dans y. même s’il n’y a aucune de ces méthodes sur les anciens appareils, cette méthode est appelée par de nouvelles.

3voto

BlueBird Points 1

Je recevais cette exception lorsque je m’en appuyant sur le bouton retour pour annuler l’intention sélecteur sur mon activité de fragment de carte. J’ai résolu ceci en remplaçant le code d’onResume (où j’étais lors de l’initialisation le fragment) à onstart() et l’app fonctionne très bien. Elle pourra être qu'utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X