Determinar quando um ViewPager altera as páginas

146

Eu tenho três páginas (fragmentos) dentro de um ViewPager, no entanto, só quero exibir um item de menu para duas dessas páginas.

O código fornecido em uma resposta anterior do SO não parece funcionar:

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

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

}

O Eclipse diz que o @Override não é necessário e o super não pode ser definido. Ele nunca é chamado pelo sistema, e mesmo se fosse como eu determinaria qual página estava sendo exibida no momento? Eu poderia ter alguma ajuda aqui?

Andrew Rabon
fonte
1
Este funcionou para mim e fornece um pouco mais de contexto sobre como usar a solução fornecida: Detectar alterações na guia ViewPager dentro do Fragment .
Gcl1

Respostas:

282

Use o 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
fonte
48
Você pode usar um SimpleOnPageChangeListener e substituir apenas onPageSelected
clocksmith
118

ViewPager.setOnPageChangeListenerestá obsoleto agora. Agora você precisa usar ViewPager.addOnPageChangeListener.

por exemplo,

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
fonte
3
Eu pareço não entender. Sou um iniciante absoluto. Então, o que colocamos dentro desses métodos. Por favor me ajude sobre onde aprender addOnPageChangeListener.
Karue Benson Karue
+1 para as informações, mas qual é a diferença desses dois ViewPager.SimpleOnPageChangeListenere ViewPager.OnPageChangeListenercomo mencionamos acima?
RoCk RoCk
2
@RoCk Com SimpleOnPageChangeListener, você só precisa substituir os métodos que realmente deseja usar. Consulte stackoverflow.com/a/31961397/608312 para exemplo.
Jake Lee
37

Você também pode usar em ViewPager.SimpleOnPageChangeListenervez de ViewPager.OnPageChangeListenersubstituir apenas os métodos que deseja 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 esta ajuda :)

Editar: de acordo com as APIs do Android, setOnPageChangeListener (ViewPager.OnPageChangeListener listener)está obsoleto. Verifique este URL: - API do Android ViewPager

Hemant Sharma
fonte
1
Como mViewPager.setOnPageChangeListener();está obsoleto agora, este está funcionando bem.
BST Kaal
No código acima, para detectar se um estado foi alterado, salve a posição atual e compare-a quando a página for rolada no método onPageScrolled.
AnupamChugh
14

Usuários 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) {
            }
        })

Atualização 2020 para o 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
fonte
11

Para o ViewPager2,

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

onde OnPageChangeCallbacké uma classe estática com três métodos:

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