Определите, когда ViewPager меняет страницы


150

У меня есть три страницы (фрагменты) внутри ViewPager, однако я хочу отобразить пункт меню только для двух из этих страниц.

Код, приведенный в предыдущем ответе SO , похоже, не работает:

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

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

}

Eclipse говорит, что @Override не требуется, и нельзя установить super. Он никогда не вызывается системой, и даже если бы это было так, как бы я мог определить, какая страница отображается в данный момент? Могу я здесь чем-нибудь помочь?


1
Это сработало для меня и дает немного больше контекста о том, как использовать данное решение: обнаружение изменения вкладки ViewPager внутри фрагмента .
gcl1

Ответы:


294

Используйте 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.
    }
});

49
Вместо этого вы можете использовать SimpleOnPageChangeListener и переопределить только onPageSelected
clocksmith

118

ViewPager.setOnPageChangeListenerустарел. Теперь вам нужно использовать ViewPager.addOnPageChangeListenerвместо этого.

например,

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
Кажется, я не понимаю. Абсолютный новичок. Итак, что мы вкладываем в эти методы. Пожалуйста, помогите мне узнать, где учиться addOnPageChangeListener.
Кару Бенсон Кару

+1 за информацию, но в чем разница между этими двумя ViewPager.SimpleOnPageChangeListenerи ViewPager.OnPageChangeListenerо чем упоминалось выше?
RoCk RoCk

2
@RoCk С SimpleOnPageChangeListener вам нужно только переопределить методы, которые вы действительно хотите использовать. См., Например, stackoverflow.com/a/31961397/608312 .
Джейк Ли

37

Вы также можете использовать ViewPager.SimpleOnPageChangeListenerвместо ViewPager.OnPageChangeListenerи переопределять только те методы, которые хотите использовать.

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

Надеюсь на эту помощь :)

Изменить: в соответствии с API Android setOnPageChangeListener (ViewPager.OnPageChangeListener listener)устарел. Пожалуйста, проверьте этот URL: - Android ViewPager API


1
Поскольку mViewPager.setOnPageChangeListener();сейчас он устарел, этот работает нормально.
BST Kaal

В приведенном выше коде, чтобы определить, изменилось ли состояние, сохраните текущую позицию и сравните ее при прокрутке страницы в методе onPageScrolled.
AnupamChugh

19

Пользователи Котлина ,

viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {

            override fun onPageScrollStateChanged(state: Int) {
            }

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

            }

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

Обновление 2020 для 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)
        }
    })

16

Для ViewPager2,

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

где OnPageChangeCallbackстатический класс с тремя методами:

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.