Determina quando un ViewPager cambia pagina


146

Ho tre pagine (frammenti) all'interno di un ViewPager, tuttavia voglio solo visualizzare una voce di menu per due di quelle pagine.

Il codice fornito in una precedente risposta SO non sembra funzionare:

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

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

}

Eclipse dice che @Override non è necessario e super non può essere impostato. Non viene mai chiamato dal sistema, e anche se fosse come determinerei quale pagina è stata mostrata al momento? Potrei avere qualche aiuto qui?


1
Questo ha funzionato per me e offre un po 'più contesto sull'uso della soluzione data: Rileva la modifica della scheda ViewPager all'interno del frammento .
gcl1

Risposte:


284

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

48
È possibile utilizzare un SimpleOnPageChangeListener invece e sovrascrivere solo su PageSelected
fabbro

118

ViewPager.setOnPageChangeListenerè deprecato ora. Ora è necessario utilizzare ViewPager.addOnPageChangeListenerinvece.

per esempio,

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) {

        }
    });

3
Mi sembra di non capire. Sono un principiante assoluto. Quindi cosa mettiamo dentro quei metodi. Per favore aiutami su dove imparare addOnPageChangeListener.
Karue Benson Karue

+1 per le informazioni, ma qual è la differenza di questi due ViewPager.SimpleOnPageChangeListenere ViewPager.OnPageChangeListenercome menzione sopra?
RoCk RoCk

2
@RoCk Con SimpleOnPageChangeListener devi solo sostituire i metodi che desideri effettivamente utilizzare. Vedere stackoverflow.com/a/31961397/608312 per esempio.
Jake Lee,

37

È inoltre possibile utilizzare ViewPager.SimpleOnPageChangeListeneranziché ViewPager.OnPageChangeListenersostituire solo i metodi che si desidera utilizzare.

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) { }
});

Spero che questo aiuto :)

Modifica: secondo le API Android, setOnPageChangeListener (ViewPager.OnPageChangeListener listener)è obsoleto. Controlla questo URL: - API ViewPager per Android


1
Come mViewPager.setOnPageChangeListener();ora è deprecato, questo funziona bene.
BST Kaal,

Nel codice precedente, per rilevare se uno stato è cambiato, salvare la posizione corrente e confrontarla quando si scorre la pagina nel metodo onPageScrolled.
AnupamChugh,

14

Utenti 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) {
            }
        })

Aggiornamento 2020 per 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)
        }
    })

11

Per ViewPager2,

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

dove OnPageChangeCallbackè una classe statica con tre metodi:

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.