Déterminer quand un ViewPager change de page

146

J'ai trois pages (Fragments) dans un ViewPager, mais je souhaite uniquement afficher un élément de menu pour deux de ces pages.

Le code donné dans une précédente réponse SO ne semble pas fonctionner:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser == true) { }
    else if (isVisibleToUser == false) {  }

}

Eclipse dit que @Override n'est pas nécessaire et que super ne peut pas être défini. Il n'est jamais appelé par le système, et même si c'était comment pourrais-je déterminer quelle page était affichée pour le moment? Puis-je avoir de l'aide ici?

arjs
la source
1
Celui-ci a fonctionné pour moi et donne un peu plus de contexte sur la façon d'utiliser la solution donnée: Détecter le changement d'onglet ViewPager dans Fragment .
gcl1

Réponses:

284

Utilisez le ViewPager.onPageChangeListener:

viewPager.addOnPageChangeListener(new OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {}
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}

    public void onPageSelected(int position) {
        // Check if this is the page you want.
    }
});
Joru
la source
48
Vous pouvez utiliser un SimpleOnPageChangeListener à la place et ne remplacer que onPageSelected
horloger le
118

ViewPager.setOnPageChangeListenerest désormais obsolète. Vous devez maintenant utiliser à la ViewPager.addOnPageChangeListenerplace.

par exemple,

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
Jaydipsinh Zala
la source
3
J'ai l'air de ne pas comprendre. Suis un débutant absolu. Alors, que mettons-nous dans ces méthodes. S'il vous plaît, aidez-moi sur où apprendre addOnPageChangeListener.
Karue Benson Karue
+1 pour l'info, mais quelle est la différence entre ces deux ViewPager.SimpleOnPageChangeListeneret ViewPager.OnPageChangeListenerquelle est la mention ci-dessus?
RoCk RoCk
2
@RoCk Avec SimpleOnPageChangeListener, il vous suffit de remplacer les méthodes que vous souhaitez réellement utiliser. Voir stackoverflow.com/a/31961397/608312 par exemple.
Jake Lee
37

Vous pouvez également utiliser à la ViewPager.SimpleOnPageChangeListenerplace ViewPager.OnPageChangeListeneret remplacer uniquement les méthodes que vous souhaitez utiliser.

viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

    // optional 
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }

    // optional 
    @Override
    public void onPageSelected(int position) { }

    // optional 
    @Override
    public void onPageScrollStateChanged(int state) { }
});

J'espère que cette aide :)

Edit: selon les API Android, setOnPageChangeListener (ViewPager.OnPageChangeListener listener)est obsolète. Veuillez vérifier cette URL: - API Android ViewPager

Hemant Sharma
la source
1
Comme il mViewPager.setOnPageChangeListener();est maintenant obsolète, celui-ci fonctionne correctement.
BST Kaal
Dans le code ci-dessus, pour détecter si un état a changé, enregistrez la position actuelle et comparez-la lorsque la page défile dans la méthode onPageScrolled.
AnupamChugh
14

Utilisateurs de Kotlin ,

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
            }

            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

            }

            override fun onPageSelected(position: Int) {
            }
        })

Mise à jour 2020 pour ViewPager2

        viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
        override fun onPageScrollStateChanged(state: Int) {
            println(state)
        }

        override fun onPageScrolled(
            position: Int,
            positionOffset: Float,
            positionOffsetPixels: Int
        ) {
            super.onPageScrolled(position, positionOffset, positionOffsetPixels)
            println(position)
        }


        override fun onPageSelected(position: Int) {
            super.onPageSelected(position)
            println(position)
        }
    })
Kishan Solanki
la source
11

Pour ViewPager2,

viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
  override fun onPageSelected(position: Int) {
    super.onPageSelected(position)
  }
})

OnPageChangeCallbackest une classe statique avec trois méthodes:

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
Jatin Sachdeva
la source