Визначте, коли ViewPager змінює сторінки


146

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

Код, поданий у попередній відповіді ТА, схоже, не працює:

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

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

}

Eclipse каже, що @Override не потрібен, і супер не можна встановити. Система її ніколи не викликає, і навіть якби я визначив, яка сторінка відображається в даний момент? Чи можу я допомогти тут?


1
Цей працював для мене і дає трохи більше контексту щодо використання даного рішення: Виявити зміну вкладки ViewPager всередині Fragment .
gcl1

Відповіді:


285

Використовуйте 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
Ви можете використовувати SimpleOnPageChangeListener замість цього і лише переосмислити onPageSelected
годиннику

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-адресу: - API ViewPager для Android


1
Як mViewPager.setOnPageChangeListener();зараз застаріло, цей працює чудово.
BST Kaal

У наведеному вище коді, щоб виявити, чи змінився стан, збережіть поточну позицію та порівняйте її, коли сторінка прокручується методом onPageScroll.
AnupamChugh

14

Користувачі 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) {
            }
        })

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

11

Для 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.