Fragment dans ViewPager renvoie l'objet vide surResume

J'utilise un FragmentPagerAdapter pour passer des fragments. J'ai besoin de certaines fonctions à appeler lorsqu'un commutateur de fragments est créé et a eu des problèmes avec OnPause et OnResume, de sorte que, suggéré par cette question, j'ai implémenté une interface OnPageSelectListener:

public interface OnPageSelectListener { void onPageSelected(); void onPageNotVisible(); } 

Il appelle la fonction OnPageSélectionnée chaque fois que cette page est au premier plan. Fonctionne bien, sauf que je veux appeler une fonction sur mon adaptateur. Je pensais que cela fonctionnerait, sauf que mon adaptateur renvoie NULL toutes les fois (même s'il est initialisé et que les données sont chargées dans ma liste comme préféré).

  public class AfterCheckFragment extends Fragment implements OnPageSelectListener{ private ListView listView; private List<Check> checkList; private CheckListAdapter adapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_check, container, false); System.out.println("VIEW create called"); //(.. some other stuff, not relevant for question..) //initializing the adapter listView = (ListView) view.findViewById(R.id.listView); adapter = new CheckListAdapter(checkList,getActivity(),trainPosition); listView.setAdapter(adapter); adapter.handleButtonVisibility(); return view; } @Override public void onPageSelected() { if(this.adapter != null) { System.out.println("adapter not null"); this.adapter.checkForActive(); }else{ System.out.println("Adapter is NULL"); } } @Override public void onPageNotVisible() { //page is moved to backgroung System.out.println("AFTER not active any more "); } } 

Voici ma question: pourquoi l' adaptateur (ou tout autre objet dans le fragment) ne retourne-t-il pas lorsque je retourne dans mon fragment? Lorsque le fragmentPager est initialisé, la fonction OnActivityCreate du fragment est appelée une seule fois, mais après cela, plus la clé ne retourne pas.

  • OnCreate, onCreateOptionsMenu, onResume, quel est l'ordre d'exécution?
  • Devrais-je restaurer sauvegardé dans l'état surCréer ou sur onRestoreInstanceState?
  • Android - Activity onCreate and Fragment onCreate
  • Qu'est ce qui se trouve entre onCreate et OnStart pour Android?
  • Null pointer Exception - findViewById ()
  • Régler le texte du filant avant que l'élément ne soit sélectionné
  • Différence entre getExtras (nom) .getString et getIntent (). GetStringExtra (nom)
  • Différence entre onCreate () et onStart ()?
  • 6 Solutions collect form web for “Fragment dans ViewPager renvoie l'objet vide surResume”

    Voici pourquoi je pense que votre CheckListAdapter (je l'appellerai listAdapter ) est nulle:

    1. Vous donnez le pagerAdapter au ViewPager
    2. The ViewPager demande à la pagerAdapter un nouveau Fragment
    3. Le ViewPager indique au FragmentManager qu'il l'utilise
    4. onPageSelected s'appelle
    5. Vous essayez d'utiliser listAdapter . Il n'a pas encore été initialisé à ce stade. (NPE)
    6. Le FragmentManager entraîne le Fragment à travers toutes ses étapes.
    7. onCreateView s'appelle. Votre listAdapter est créé.

    N'essayez pas d'utiliser les données internes d'un fragment en dehors de celui-ci. Il est destiné à fonctionner comme une unité autonome, il ne sera pas très bon si vous l'utilisez différemment. Puisque le fragment est initialisé à un stade ultérieur, vous ne pouvez pas l'utiliser comme vous avez l'intention.
    Vous pouvez essayer de faire ce que vous voulez faire dans le fragment, plutôt que le pagerAdapter , ou écrire une méthode dans l' Activity hébergement et l'appeler à partir du fragment lorsqu'il est prêt, ou même lancer un événement.

    Vous devez appeler onPageSelected () après l'initialisation de l'adaptateur et setAdapter () sinon l'adaptateur renverra nulle toujours

    ViewPager va créer et détruire des fragments lorsque l'utilisateur change de pages (voir ViewPager.setOffscreenPageLimit() ). Donc onActivityCreated() est seulement appelé sur le fragment lorsqu'il est restauré ou configuré pour la première fois. Par conséquent, des fragments peuvent être créés sans jamais avoir onActivityCreated() appelé.

    Au lieu de onActivityCreated() , je recommanderais de onViewCreated() et de configurer votre adaptateur là-bas. Aucun fragment ne peut être affiché sans avoir créé une vue, donc c'est un bon endroit pour faire ce genre de choses.

    Si votre logique OnPageSelectListener fonctionne, c'est bon. J'ai trouvé la meilleure façon de savoir quand votre fragment est en réalité devant l'utilisateur en setPrimaryItem() dans FragmentPagerAdapter . L'obtention de l'événement hors-vue de la page est un peu plus difficile, car vous devez conserver une référence au fragment de l' setPrimaryItem() précédent setPrimaryItem() .

    C'est parce que Viewpager appelle OnpageSelected Way avant Fragments dans oncreateView () / onActivityCreated () est appelé.

    La meilleure façon pour vous est de gonfler vos vues dans le constructeur du Fragment et de configurer les Adaptateurs.

    Ou

    Utilisez une variable membre pour stocker si le Fragment est actif ou non. Et utilisez la variable dans oncreateview () pour appeler la fonction sur votre adaptateur.

    Pourquoi n'utilisez-vous pas viewpager.addOnPageChangeListener , dans votre pager, après avoir défini son adaptateur et setOffscreenPageLimit() au lieu de l' implements sur votre fragment?

    Voici un exemple de code:

     viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if(position == 1){ // if you want the second page, for example //Your code here } } @Override public void onPageScrollStateChanged(int state) { } }); 

    Faites-le dans votre Activity , où vous avez configuré votre ViewPager , bien sûr.

    Pour moi, j'ai dû appeler cela sur mon visionnaire:

     myViewPager.setSaveFromParentEnabled(false); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.