พิจารณาว่าเมื่อใดที่ ViewPager เปลี่ยนหน้า


146

ฉันมีสามหน้า (แฟรกเมนต์) ใน ViewPager แต่ฉันต้องการแสดงรายการเมนูสำหรับสองหน้าเท่านั้น

รหัสที่ให้ไว้ในคำตอบ SO ก่อนหน้าดูเหมือนจะไม่ทำงาน:

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

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

}

Eclipse บอกว่าไม่จำเป็น @Override และไม่สามารถตั้งค่า super ได้ มันไม่เคยถูกเรียกโดยระบบและถึงแม้ว่าฉันจะกำหนดได้อย่างไรว่าหน้าใดที่ถูกแสดงในขณะนี้ ฉันขอความช่วยเหลือจากที่นี่ได้ไหม


1
อันนี้ใช้งานได้สำหรับฉันและให้บริบทเพิ่มเติมเล็กน้อยเกี่ยวกับวิธีใช้โซลูชันที่ระบุ: ตรวจสอบการเปลี่ยนแปลงแท็บ ViewPager ภายในแฟรกเมนต์
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 แทนและแทนที่เฉพาะบน PageSelected เท่านั้น
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โปรดช่วยฉันในการที่จะเรียนรู้
Karue Benson Karue

+1 สำหรับข้อมูล แต่สิ่งที่เป็นความแตกต่างของทั้งสองViewPager.SimpleOnPageChangeListenerและViewPager.OnPageChangeListenerเป็นสิ่งที่กล่าวถึงข้างต้น
RoCk RoCk

2
@RoCk ด้วย SimpleOnPageChangeListener คุณจะต้องแทนที่วิธีที่คุณต้องการใช้จริงๆ ดูstackoverflow.com/a/31961397/608312ตัวอย่าง
Jake Lee

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

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.