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í?


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

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

        }
    });

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


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

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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.