171

I have three pages (Fragments) inside a ViewPager, however I only want to display a menu item for two of those pages.

The code given in a previous SO answer does not seem to work:

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

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

}

Eclipse says @Override isn't needed and super can't be set. It's never called by the system, and even if it was how would I determine which page was being shown at the moment? Could I have some help here?

Community
  • 1
  • 1
arjs
  • 2,835
  • 4
  • 22
  • 18
  • 1
    This one worked for me, and gives a little more context about how to use the given solution: [Detect ViewPager tab change inside Fragment](http://stackoverflow.com/questions/9779397/detect-viewpager-tab-change-inside-fragment). – gcl1 Nov 30 '12 at 17:15

5 Answers5

326

Use the 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.
    }
});
chinmish
  • 99
  • 1
  • 11
Joru
  • 4,406
  • 1
  • 19
  • 13
126

ViewPager.setOnPageChangeListener is deprecated now. You now need to use ViewPager.addOnPageChangeListener instead.

for example,

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

        }
    });
Ryan C
  • 1,003
  • 1
  • 14
  • 26
Jaydipsinh Zala
  • 16,558
  • 7
  • 41
  • 45
  • 4
    I seem not to understand. Am an absolute beginner. So what do we put inside those methods. Please help me on where to learn `addOnPageChangeListener`. – Karue Benson Karue May 14 '16 at 02:20
  • +1 for the info, but what is the difference of these two `ViewPager.SimpleOnPageChangeListener` and `ViewPager.OnPageChangeListener` as what mention above? – RoCkDevstack Jun 13 '16 at 11:28
  • 2
    @RoCk With SimpleOnPageChangeListener you only need to override the methods you actually want to use. See http://stackoverflow.com/a/31961397/608312 for example. – Jake Lee Sep 10 '16 at 07:32
44

For ViewPager2,

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

where OnPageChangeCallback is a static class with three methods:

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
adiga
  • 34,372
  • 9
  • 61
  • 83
Jatin Sachdeva
  • 1,091
  • 11
  • 12
40

You can also use ViewPager.SimpleOnPageChangeListener instead of ViewPager.OnPageChangeListener and override only those methods you want to use.

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

Hope this help :)

Edit: As per android APIs, setOnPageChangeListener (ViewPager.OnPageChangeListener listener) is deprecated. Please check this url:- Android ViewPager API

Hemant Sharma
  • 1,239
  • 12
  • 9
  • 1
    As `mViewPager.setOnPageChangeListener();` is deprecated now, this one is working fine. – BST Kaal Nov 23 '15 at 07:09
  • In the above code, to detect whether a state has changed save the current position and compare it when the page is scrolled in onPageScrolled method. – AnupamChugh Feb 27 '18 at 12:14
35

Kotlin Users,

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
            }

            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

            }

            override fun onPageSelected(position: Int) {
            }
        })

Update 2020 for 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
  • 13,761
  • 4
  • 85
  • 82