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));
}
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.
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.
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");
}
}
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">
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.