Gestion du cycle de vie Android des fragments dans ViewPager et FragmentPagerAdapter

J'ai eu du mal à trouver la bonne gestion de Fragments à l'intérieur d'un FragmentActivity avec un ViewPager est. Avant d'entrer dans les détails, un bref résumé de la question que je suis confronté est le suivant:

J'ai un FragmentActivity avec un ViewPager. Le ViewPager utilise une coutume, pourtant très simple FragmentPagerAdapter. Chaque Fragment dans le ViewPager compose d'une ExpandableListView. J'ai aussi une barre d'action le bouton "Actualiser". Pour l'instant, supposons que le ViewPager n'a qu'un seul Fragment. L'activité est créée, et le Fragment's ExpandableListView est rempli (so far so good). Lorsque l'Actualisation bouton est cliqué, la méthode de gestion au sein de la FragmentActivity parcourt la liste des Fragments qui sont affectés à la FragmentPagerAdapter et les appels refresh() sur chaque Fragment pour remplir sa Liste. Toutefois, lorsque l'orientation de l'appareil changements (par exemple de portrait à paysage), l'Activité est recréée et sont donc les fragments. En cliquant sur le bouton Actualiser maintenant va itérer sur les non-initialisées Fragments.

Je sais que je suis très vague, et surtout sans exemple de code, mais s'il vous plaît garder avec moi. J'ai fait remonter le problème et les appels de méthode comme suit à partir du début de la demande/de l'activité:

  1. FragmentActivity.onCreate()
  2. FragmentActivity.setContentView()
  3. FragmentActivity.createPagerFragments() <-- cela crée une liste de tableaux de Fragments et assignes à un nouveau FragmentPagerAdapter qui est à son tour affecté à la ViewPager.
  4. Fragment.onAttach()
  5. Fragment.onCreate() < - rien de spécial ici, il suffit d'appeler la méthode super.
  6. Fragment.onCreateView() < - rien de spécial, juste de gonfler la mise en page
  7. Fragment.onActivityCreated() <-- rien ici non plus.
  8. << Toutes les bonnes, les changements d'orientation de l'ici >>
  9. FragmentActivity.onCreate()
  10. Fragment.onAttach()
  11. Fragment.onCreate()
  12. FragmentActivity.setContentView()
  13. FragmentActivity.createPagerFragments()
  14. Fragment.onCreateView()
  15. Fragment.onActivityCreated()
  16. << Actualiser le bouton cliqué >>
  17. FragmentActivity.refresh() <-- effectue une itération nouvellement créé Fragments de #13 (pas ces par Android!).
  18. << Crash: NullPointerException pour mExpandableListView dans le Fragment. >>

Donc, le problème, comme je le vois, est comme suit:
Quand Android re-crée le FragmentActivity et ses Views après un changement d'orientation de l'écran (appels #9 à 15 ci-dessus), il crée de nouvelles Fragment objets avec leur état restauré à ce que les originaux ont été. Cependant, celles-ci semblent être complètement géré par le FragmentManager, et non pas par le FragmentPagerAdapter. En revanche, lorsque la FragmentPagerAdapter est re-créé avec le Fragments dans l'activité de onCreate méthode (voir appel n ° 13) la Fragments affectés à l'adaptateur n'ont jamais de leur Fragment.onCreate() ou Fragment.onCreateView() méthodes appelées à tous. Ainsi, lorsque la méthode refresh() est appelée (voir n ° 17), la méthode effectue une itération sur ces Fragments qui n'ont pas été initialisés. Par conséquent, lorsqu'ils essaient de remplir le ExpandableListView, le point de vue de la variable d'instance est NULL. Ceci est dû au fait que la variable d'instance est affecté uniquement dans le Fragment.onCreateView() méthode, qui n'est jamais appelée sur ces Fragments.

Donc ma question est: comment bien faire ré-utilisation de la re-recréé (Android) Fragments après l'orientation de l'écran a changé afin d'éviter d'en créer de nouvelles qui ne sont pas initialisées? J'ai besoin d'avoir une référence valide, afin d'appeler la méthode refresh() qui renseigne sur la demande. Idéalement, ils devraient également être attribuée à la FragmentPagerAdapter.

J'espère avoir été clair dans la description du problème, et la raison pour laquelle je n'ai pas fourni un exemple de code est parce que le problème peut être vu) n'est pas dans le code lui-même, mais à partir d'un plutôt incorrect (seemigly) re-création de Fragments plutôt que de ré-utilisation. Mais si nécessaire, je peux vous donner un exemple de code, je viens, par ce moyen serait plus clair.

Merci!

source d'informationauteur vmivanov