Determinar cuándo un ViewPager cambia de página

146

Tengo tres páginas (Fragmentos) dentro de un ViewPager, sin embargo, solo quiero mostrar un elemento de menú para dos de esas páginas.

El código dado en una respuesta SO anterior no parece funcionar:

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

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

}

Eclipse dice que @Override no es necesario y que super no se puede configurar. El sistema nunca lo llama, e incluso si fuera así, ¿cómo determinaría qué página se muestra en este momento? ¿Podría tener alguna ayuda aquí?

Andrew Rabon
fuente
1
Este funcionó para mí, y da un poco más de contexto sobre cómo usar la solución dada: Detectar el cambio de pestaña ViewPager dentro de Fragment .
gcl1

Respuestas:

284

Usa el 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
fuente
48
Puede usar un SimpleOnPageChangeListener en su lugar y solo anular onPageSelected
clocksmith
118

ViewPager.setOnPageChangeListenerestá en desuso ahora. Ahora necesita usar ViewPager.addOnPageChangeListeneren su lugar.

por ejemplo,

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
fuente
3
Parece que no entiendo. Soy un principiante absoluto. Entonces, ¿qué ponemos dentro de esos métodos? Por favor, ayúdame sobre dónde aprender addOnPageChangeListener.
Karue Benson Karue
+1 para la información, pero ¿cuál es la diferencia de estos dos ViewPager.SimpleOnPageChangeListenery ViewPager.OnPageChangeListenercomo mencionamos anteriormente?
RoCk RoCk
2
@RoCk Con SimpleOnPageChangeListener solo necesita anular los métodos que realmente desea usar. Ver stackoverflow.com/a/31961397/608312 por ejemplo.
Jake Lee
37

También puede usar en ViewPager.SimpleOnPageChangeListenerlugar de ViewPager.OnPageChangeListenery anular solo los métodos que desea usar.

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

Espero que esto ayude :)

Editar: según las API de Android, setOnPageChangeListener (ViewPager.OnPageChangeListener listener)está en desuso. Verifique esta URL: - API de Android ViewPager

Hemant Sharma
fuente
1
Como mViewPager.setOnPageChangeListener();está en desuso ahora, este funciona bien.
BST Kaal
En el código anterior, para detectar si un estado ha cambiado, guarde la posición actual y compárela cuando la página se desplaza en el método onPageScrolled.
AnupamChugh
14

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

Actualización 2020 para 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
fuente
11

Para ViewPager2,

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

donde OnPageChangeCallbackes una clase estática con tres métodos:

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