Circulaire ViewPager. Les fragments ne fonctionnent pas comme ils l'ont supposé après le premier tour

D'accord, j'ai donc besoin d'un ViewPager circulaire. J'avais vraiment du mal à l'appliquer. Maintenant que je l'ai mis en œuvre et qu'il fonctionne bien dans la mesure où le volet circulaire est concerné. Mais j'ai remarqué un problème. Quoi qu'il en soit, après que le premier tour de fragments de défilement ne fonctionne pas. J'ai trois Fragments avec un bouton à leur intérieur. Le bouton fonctionne au premier tour mais quand je reviens au bouton de la première page ne fonctionne pas. Ps J'ai utilisé la technique des faux pages pour faire circuler le viseur.

Voici le code

  • Android FragmentTransaction.addToBackStack confusion
  • Où appeler getChildFragmentManager ()?
  • Meilleure pratique pour les fragments imbriqués dans Android 4.0, 4.1 (<4.2) sans utiliser la bibliothèque de support
  • Comment accéder à la valeur d'edittext à l'intérieur du fragment qui se trouve dans un programme de visualisation
  • Visualiser la couleur de fond saigne à la première page
  • Erreur de mémoire de curseur curseur Android dans un fragment spécifique
  • mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager(), this)); //mViewPager.setOnPageChangeListener(new CircularViewPagerHandler(mViewPager)); mViewPager.setCurrentItem(1, false); mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (position == 0) { mViewPager.setCurrentItem(3, false); Log.d("TAG", "Swiped before first page, looping and resetting to last page."); } else if (position == 4) { mViewPager.setCurrentItem(1, false); Log.d("TAG", "Swiped beyond last page, looping and resetting to first page."); } } @Override public void onPageScrollStateChanged(int state) { Log.d("onPageScrollState", "state:" + state); int currentPage = mViewPager.getCurrentItem(); if(currentPage==1){ imgCenter.setImageResource(R.drawable.take_ride); imgLeft.setImageResource(R.drawable.give_ride); imgRight.setImageResource(R.drawable.setting); } if(currentPage==2){ imgCenter.setImageResource(R.drawable.setting); imgRight.setImageResource(R.drawable.take_ride); imgLeft.setImageResource(R.drawable.give_ride); } if (currentPage==3){ imgCenter.setImageResource(R.drawable.give_ride); imgLeft.setImageResource(R.drawable.take_ride); imgRight.setImageResource(R.drawable.setting); } } }); 

    Voici la classe PagerAdapter

      public class PagerAdapter extends FragmentPagerAdapter { Context mcontext; public PagerAdapter(FragmentManager fm, Context context) { super(fm); mcontext = context; } @Override public Fragment getItem(int position) { if (position == 0) { return new HomeFragment2(); } else if(position==1){ return new HomeFragment(); } else if (position == 2) { return new SettingFragment(); } else if(position==3){ return new HomeFragment2(); } else return new HomeFragment(); } @Override public int getCount() { return 5; } } 

  • Mes fragments dans l'onglet viewpager ne se rafraîchissent pas
  • Le fragment de contrôle est-il actuellement visible ou non dans Android?
  • Travailler avec ViewPager et Fragments
  • Comment accéder à la valeur d'edittext à l'intérieur du fragment qui se trouve dans un programme de visualisation
  • Comment faire passer l'indicateur de la page Circle vers l'avant dans Android
  • One Solution collect form web for “Circulaire ViewPager. Les fragments ne fonctionnent pas comme ils l'ont supposé après le premier tour”

    J'ai créé une application de test simple avec vous PagerAdapter et Fragment simple s avec un Button :

    Entrez la description de l'image ici

    Et ça marche bien!

    J'ai téléchargé le code source ici , afin que vous puissiez le vérifier et voir s'il y a une différence avec le vôtre.

    En tant que Fragment , j'ai utilisé:

     public class FragmentA extends android.support.v4.app.Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_a, container, false); rootView.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Snackbar.make(v, "Hi, fragment A", Snackbar.LENGTH_SHORT).show(); } }); return rootView; } } 

    Donc, ce que je peux recommander

    • Remplacez vos fragments par des fausses (comme celle ci-dessus). Si cela fonctionne – le problème se trouve dans le code Fragment , pas dans le ViewPager circulaire

    • Si cela ne fonctionne toujours pas – j'essaierais, au lieu de recréer des fragments à plusieurs reprises -, les créer une fois et stocker:

        public class PagerAdapter extends FragmentPagerAdapter { Context mcontext; Fragment [] fragments; public PagerAdapter(FragmentManager fm, Context context, Fragment [] fragments) { super(fm); mcontext = context; this.fragments = fragments; } @Override public Fragment getItem(int position) { return fragments[position]; } @Override public int getCount() { return fragments.length; } } 

      Et en Activity :

       Fragment[] fragments = { Fragment.instantiate(this, FragmentC.class.getName()), Fragment.instantiate(this, FragmentA.class.getName()), Fragment.instantiate(this, FragmentB.class.getName()), Fragment.instantiate(this, FragmentC.class.getName()), Fragment.instantiate(this, FragmentA.class.getName()), }; ..... viewPager.setAdapter(new PagerAdapter(getSupportFragmentManager(), this, fragments)); 

    Faites-moi savoir si cela vous aide!

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.