web-dev-qa-db-fra.com

SavedInstanceState est toujours null dans le fragment

J'ai un fragment attaché à l'activité en utilisant XML (et setContentView () en activité). J'ai un problème car j'ai des vues très dynamiques dans mon fragment, donc quand l'orientation change .__, je dois restaurer tous les états de vues. 

J'ai un problème parce que j'utilise quelque chose comme ça:

public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("restore", true);
        outState.putInt("nAndroids", 2);
   }

Mais après le changement d'orientation lorsque les méthodes avec le paramètre Bundle savedInstanceState sont appelées (comme onCreateView, etc.), savedInstanceState est toujours nul. 

Je ne suis pas un noob sous Android mais maintenant je suis très en colère à cause de ce problème ...

public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    if (savedInstanceState == null) {
        //smth
    } else {
        // smthelse THIS IS NEVER REACHED BECAUSE BUNDLE IS ALWAYS NULL
    }

    getListView().setDivider(getResources().getDrawable(R.drawable.list_divider));
}
29
TommyNecessary

Tout le problème était que je ne déclarais pas Android: id pour le fragment en XML. Android a besoin d'un ID ou d'un TAG pour reconnaître le fragment stocké et reproduire tous les éléments qu'il contient. Alors, souvenez-vous, chaque instance de fragment nécessite un identifiant ou une balise unique!

De même, lorsque setRetainInstance (true) est déclarée, bundle doit toujours renvoyer null.

59
TommyNecessary

J'ai eu un problème similaire dans lequel j'étais toujours en train de recevoir savedInstanceState, malgré le fait de fournir le paquet au fragment.

La seule solution qui a fonctionné pour moi était de faire 

myFragment.setArguments(bundle) 

avec mon paquet de l'activité et faire un 

Bundle bundle = this.getArguments();

dans onCreateView du fragment.

J'espère que ceci aide quelqu'un d'autre.

4
Arun Yogannadan

Pour le fragment: -

use this for save state of fragment on orientation.

onCreate(Bundle save)
{
   super.onCreate(save);
   setRetainInstance(true);
}

Voir ce tutoriel: - http://techbandhu.wordpress.com/2013/07/02/Android-headless-fragment/

Pour l'activité: -

Lorsque vous démarrez votre application, dans onCreate, votre objet bundle est null, vous devez donc cocher la case ci-dessous et lorsque vous faites pivoter votre écran, onSaveInstance est appelé et votre objet bundle est initialisé.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    if (savedInstanceState != null) {
         boolean t = outState.getBoolean("restore"); 
         int s = outState.getInt("nAndroids");
    }
}
2
Rahul Gupta

Commencez par mettre vos données, puis appelez super.onSaveInstanceState(outState);

public void onSaveInstanceState(Bundle outState) {

    outState.putBoolean("restore", true);
    outState.putInt("nAndroids", 2);
    super.onSaveInstanceState(outState);
}

Et assurez-vous que l'activité n'a pas la propriété nohistory dans AndroidManifest.xml ou définissez-la sur false .

        <activity
        Android:noHistory="false">
0
AmirHossein Manian

Ok, je sais que c’est un vieux message, mais je ne trouvais pas la bonne réponse pour moi ni pour d’autres endroits. Je vous explique donc comment j’ai réglé mon cas.

Donc, mon fragment est à l'intérieur d'une activité. Et au départ, j'avais essayé de sauvegarder Bundle uniquement dans Fragment et de le récupérer sur onCreateView. Cependant c'était le problème.

J'ai résolu ce problème en lançant l'objet myFragment en activité et en le mettant en activité Bundle à onSaveInstanceState (). Puis récupéré à onRestoreInstanceState (). J'ai utilisé getSupportFragmentManager (). PutFragment/getFragment. Ensuite, savedInstanceState dans fragment n'était plus nul.

0
user3879095