3

J'ai une activité avec fragment. Un spinner dans le fragment détermine lequel des deux fragments apparaît sous le spinner. Ces 2 fragments héritent d'un fragment abstrait. Dans les fragments, l'utilisateur entre des données dans des champs. J'ai besoin de restaurer les données après la rotation de l'écran. Comment faire cela en utilisant onSaveInstanceState? Je ne veux pas retenir de fragments ou autre chose.Restaurer les fragments imbriqués à la rotation

code

  • Dans l'activité que je ne fais rien lié à une rotation ou d'enregistrer l'état. Je ne remplace pas onSaveInstanceState.
  • Dans le fragment avec la fileuse

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
        super.onSaveInstanceState(outState); 
        outState.putInt(SPINNER_SELECTION, selectedPosition); 
        outState.putParcelable(FIELDS, getFragmentManager() 
         .saveFragmentInstanceState(getFragmentManager() 
         .findFragmentById(R.id.container_with_fields))); 
    } 
    

    En onCreateView je vérifie if (savedInstanceState == null) et restaurer les champs.

  • Dans les fragments internes, je ne fais rien.

Erreur

Actuellement, la méthode onSaveInstanceState est invoquée mais pas la méthode onCreateView. Quelque part entre je reçois l'erreur suivante qui semble avoir rien à voir avec mon code:

07-03 10:33:06.079: W/dalvikvm(4286): threadid=1: thread exiting with uncaught exception (group=0x41e26700) 
07-03 10:33:06.079: E/AndroidRuntime(4286): FATAL EXCEPTION: main 
07-03 10:33:06.079: E/AndroidRuntime(4286): java.lang.NullPointerException 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.FragmentManagerImpl.saveFragmentBasicState(FragmentManager.java:1599) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.FragmentManagerImpl.saveAllState(FragmentManager.java:1655) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.Activity.onSaveInstanceState(Activity.java:1238) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.Activity.performSaveInstanceState(Activity.java:1186) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java:1240) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3851) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.ActivityThread.access$800(ActivityThread.java:159) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1322) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.os.Looper.loop(Looper.java:176) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at android.app.ActivityThread.main(ActivityThread.java:5419) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at java.lang.reflect.Method.invoke(Method.java:525) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
07-03 10:33:06.079: E/AndroidRuntime(4286):  at dalvik.system.NativeStart.main(Native Method) 

L'application ne tombe pas en panne, mais l'activité semble se terminé. Après la rotation, l'écran se fige rapidement et l'activité parente est affichée.

J'ai vérifié que j'avais les derniers SDK et libs installés et utilisés dans le projet.

Répondre

1

Je trouve que l'erreur apparaît à cause de cette ligne:

outState.putParcelable(FIELDS, getFragmentManager() 
    .saveFragmentInstanceState(getFragmentManager() 
    .findFragmentById(R.id.container_with_fields))); 

Je ne peut toujours pas expliquer ...

Pour une raison quelconque, je ne parvenais pas à faire l'économie en utilisant onSaveInstanceState mais j'ai aussi lu qu'il est préférable d'utiliser setRetainInstance. Alors que le premier entraîne des frais généraux supplémentaires, le second saute certaines des méthodes. Donc, j'ai fini par retenir l'instance du fragment externe. De plus, j'ai ajouté des propriétés (variables membres) pour stocker tout ce qui est entré dans les champs des fragments. De cette façon, je restaure l'état une fois le fragment recréé. Eh bien, dit correctement, je vérifie si mes propriétés sont initialisées et si c'est le cas, je mets les valeurs qu'elles ont dans les champs des fragments.

J'espère que cela aidera quelqu'un d'autre.

Questions connexes