Tentukan kapan ViewPager mengubah halaman

146

Saya memiliki tiga halaman (Fragmen) di dalam ViewPager, namun saya hanya ingin menampilkan item menu untuk dua halaman tersebut.

Kode yang diberikan dalam jawaban SO sebelumnya sepertinya tidak berfungsi:

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

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

}

Eclipse mengatakan @Override tidak diperlukan dan super tidak dapat diatur. Tidak pernah dipanggil oleh sistem, dan bahkan jika itu bagaimana saya menentukan halaman mana yang sedang ditampilkan saat ini? Bisakah saya mendapat bantuan di sini?

Andrew Rabon
sumber
1
Yang ini bekerja untuk saya, dan memberikan sedikit lebih banyak konteks tentang bagaimana menggunakan solusi yang diberikan: Mendeteksi perubahan tab ViewPager di dalam Fragmen .
gcl1

Jawaban:

283

Gunakan 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
sumber
48
Anda dapat menggunakan SimpleOnPageChangeListener sebagai gantinya dan hanya menimpa onPageSelected
clocksmith
118

ViewPager.setOnPageChangeListenersudah usang sekarang. Anda sekarang perlu menggunakanViewPager.addOnPageChangeListener sebagai gantinya.

sebagai contoh,

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
sumber
3
Sepertinya saya tidak mengerti. Saya seorang pemula yang absolut. Jadi apa yang kita masukkan ke dalam metode itu. Tolong bantu saya di tempat belajar addOnPageChangeListener.
Karue Benson Karue
+1 untuk info, tetapi apa perbedaan keduanya ViewPager.SimpleOnPageChangeListenerdan ViewPager.OnPageChangeListenerseperti apa yang disebutkan di atas?
RoCk RoCk
2
@RoCk Dengan SimpleOnPageChangeListener Anda hanya perlu mengganti metode yang sebenarnya ingin Anda gunakan. Lihat stackoverflow.com/a/31961397/608312 misalnya.
Jake Lee
37

Anda juga dapat menggunakan ViewPager.SimpleOnPageChangeListeneralih-alih ViewPager.OnPageChangeListenerdan menimpa hanya metode yang ingin Anda gunakan.

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

Semoga bantuan ini :)

Sunting: Sesuai API Android, setOnPageChangeListener (ViewPager.OnPageChangeListener listener)sudah tidak digunakan lagi. Silakan periksa url ini: - Android ViewPager API

Hemant Sharma
sumber
1
Seperti yang mViewPager.setOnPageChangeListener();sudah usang sekarang, ini berfungsi dengan baik.
BST Kaal
Dalam kode di atas, untuk mendeteksi apakah suatu keadaan telah berubah simpan posisi saat ini dan bandingkan ketika halaman digulir dalam metode onPageScrolled.
AnupamChugh
14

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

Perbarui 2020 untuk 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
sumber
11

Untuk ViewPager2,

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

di mana OnPageChangeCallbackkelas statis dengan tiga metode:

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