Określ, kiedy ViewPager zmienia strony

146

Mam trzy strony (fragmenty) w ViewPager, jednak chcę wyświetlić element menu tylko dla dwóch z tych stron.

Kod podany w poprzedniej odpowiedzi SO nie wydaje się działać:

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

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

}

Eclipse mówi, że @Override nie jest potrzebne i nie można ustawić super. Nigdy nie jest wywoływany przez system, a nawet gdyby tak było, jak określić, która strona jest w tej chwili wyświetlana? Czy mogę tu uzyskać pomoc?

Andrew Rabon
źródło
1
Ten zadziałał dla mnie i daje trochę więcej kontekstu na temat korzystania z danego rozwiązania: Wykryj zmianę zakładki ViewPager w fragmencie .
gcl1

Odpowiedzi:

282

Użyj 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
źródło
48
Możesz zamiast tego użyć SimpleOnPageChangeListener i nadpisać tylko onPageSelected
zegarmistrz
118

ViewPager.setOnPageChangeListenerjest teraz przestarzała. Teraz musisz użyć ViewPager.addOnPageChangeListenerzamiast tego.

na przykład,

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
źródło
3
Wydaje mi się, że nie rozumiem. Jestem absolutnie początkującym. Więc co umieścimy w tych metodach. Proszę, pomóż mi, gdzie się uczyć addOnPageChangeListener.
Karue Benson Karue
+1 za info, ale jaka jest różnica między tymi dwoma ViewPager.SimpleOnPageChangeListenera ViewPager.OnPageChangeListenerco wspomnieć powyżej?
RoCk RoCk
2
@RoCk Dzięki SimpleOnPageChangeListener wystarczy zastąpić metody, których faktycznie chcesz używać. Na przykład zobacz stackoverflow.com/a/31961397/608312 .
Jake Lee,
37

Możesz także użyć ViewPager.SimpleOnPageChangeListenerzamiast ViewPager.OnPageChangeListeneri przesłonić tylko te metody, których chcesz użyć.

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

Mam nadzieję, że to pomoże :)

Edycja: zgodnie z interfejsami API systemu Android setOnPageChangeListener (ViewPager.OnPageChangeListener listener)jest przestarzała. Sprawdź ten adres URL: - Android ViewPager API

Hemant Sharma
źródło
1
Jak mViewPager.setOnPageChangeListener();jest przestarzała teraz, ten jest w porządku pracy.
BST Kaal
W powyższym kodzie, aby wykryć zmianę stanu, zapisz bieżącą pozycję i porównaj ją podczas przewijania strony metodą onPageScrolled.
AnupamChugh
14

Użytkownicy 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) {
            }
        })

Aktualizacja 2020 dla 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
źródło
11

W przypadku ViewPager2,

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

gdzie OnPageChangeCallbackjest klasą statyczną z trzema metodami:

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
Jatin Sachdeva
źródło