J'ai observé exactement les mêmes symptômes (signalés comme numéro 133394 ) dans un projet comportant deux activités A y B qui s'étendent ActionBarActivity
. Activité A est l'activité principale, et je reçois toujours null
pour savedInstanceState
en onCreate
de son fragment de liste lors du retour d'une activité de vue détaillée B . Après plusieurs heures, ce problème s'est révélé être un problème de navigation déguisé.
Ce qui suit peut être pertinent pour mon installation et provient d'autres réponses sur cette page :
- Étant donné que este j'ai fait en sorte que le fragment et l'activité aient chacun un identifiant unique.
- Il n'y a pas de remplacement de
onSaveInstanceState
sans super
appeler.
- Activité A est spécifié comme acitivy B Le parent de l'enfant dans
AndroidManifest.xml
en utilisant à la fois le android:parentActivityName
et l'attribut correspondant meta-data
pour les versions antérieures d'Android (voir " Fournir une navigation vers le haut ").
Déjà sans code de création correspondant tel que getActionBar()
.setHomeButtonEnabled(true)
l'activité B a un bouton retour fonctionnel ( < ) dans sa barre d'action. Lorsque vous appuyez sur ce bouton, l'activité A réapparaît mais avec (a) tous les états d'instance précédents sont perdus, (b) onCreate
toujours appelé, et (c) savedInstanceState
toujours null
.
Il est intéressant de noter que lorsque j'appuie sur le bouton de retour prévu à cet effet sur le bord inférieur de l'écran de l'émulateur (un triangle ouvert qui pointe vers la gauche), l'activité A réapparaît tel qu'il a été laissé (c.-à-d. que son état d'instance est entièrement conservé) sans invoquer l'option onCreate
. Il y a donc peut-être un problème de navigation ?
Après plus de lecture j'ai implémenté mes propres instructions de navigation pour qu'elles s'exécutent en réponse à une pression sur le bouton arrière en activité. B :
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home)
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Rien concernant le rétablissement de l'état d'activité de l'instance A changé. NavUtils
fournissent également une méthode getParentActivityIntent(Activity)
y navigateUpTo(Activity, Intent)
qui nous permettent de modifier l'intention de navigation pour demander explicitement que l'activité A n'est pas démarré fraîchement (et donc sans état d'instance sauvegardé fourni) par la définition de l'attribut FLAG_ACTIVITY_CLEAR_TOP
drapeau :
Si elle est définie, et que l'activité en cours de lancement est déjà exécutée dans la tâche en cours, au lieu de lancer une nouvelle instance de cette activité activité, toutes les autres activités situées au-dessus seront fermées et l'activité en cours de lancement est déjà en cours d'exécution dans la tâche actuelle. nouvel Intent.
Dans mes mains, cela résout le problème de l'état d'instance perdu et pourrait ressembler à ceci :
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()== android.R.id.home) {
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, intent);
return true;
}
return super.onOptionsItemSelected(item);
}
Notez que cela peut ne pas être la solution complète dans d'autres cas où un utilisateur peut passer directement à l'activité B à partir d'une autre tâche (voir aquí ). De même, une solution éventuellement identique dans le comportement qui ne fait pas appel à la fonction NavUtils
est de simplement appeler finish()
:
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()== android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
Les deux solutions fonctionnent dans mes mains. Je ne fais que spéculer que le problème original est une implémentation par défaut légèrement incorrecte du bouton arrière, et il peut être lié à cette implémentation invoquant une sorte de navigateUp
qui manque FLAG_ACTIVITY_CLEAR_TOP
.
2 votes
Vous devez appeler super.onSaveInstanceState(savedInstanceState) avant d'ajouter vos valeurs au Bundle, sinon elles seront effacées lors de cet appel (Droid X Android 2.2).
2 votes
J'ai le même problème et je peux confirmer que cela ne fonctionne pas. Quelqu'un l'a déjà résolu ?