Xác định khi ViewPager thay đổi trang


146

Tôi có ba trang (Đoạn) trong ViewPager, tuy nhiên tôi chỉ muốn hiển thị một mục menu cho hai trong số các trang đó.

Mã được đưa ra trong câu trả lời SO trước đó dường như không hoạt động:

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

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

}

Eclipse nói rằng @Override không cần thiết và siêu không thể được thiết lập. Nó không bao giờ được gọi bởi hệ thống, và ngay cả khi đó là cách tôi xác định trang nào đang được hiển thị vào lúc này? Tôi có thể có một số trợ giúp ở đây?


1
Cái này hoạt động với tôi và cung cấp thêm một chút bối cảnh về cách sử dụng giải pháp đã cho: Phát hiện thay đổi tab ViewPager bên trong Fragment .
gcl1

Câu trả lời:


282

Sử dụng 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
Thay vào đó, bạn có thể sử dụng SimpleOnPageChangeListener và chỉ ghi đè onPageSelected
thợ đồng hồ

118

ViewPager.setOnPageChangeListenerbây giờ không được dùng nữa Bây giờ bạn cần sử dụng ViewPager.addOnPageChangeListenerthay thế.

ví dụ,

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
Tôi dường như không hiểu. Là một người mới bắt đầu tuyệt đối. Vì vậy, những gì chúng ta đặt bên trong những phương pháp. Xin hãy giúp tôi về nơi để học addOnPageChangeListener.
Karue Benson Karue

+1 cho thông tin, nhưng sự khác biệt của hai điều này ViewPager.SimpleOnPageChangeListenerViewPager.OnPageChangeListenernhư những gì đã đề cập ở trên?
RoCk RoCk

2
@RoCk Với SimpleOnPageChangeListener, bạn chỉ cần ghi đè các phương thức bạn thực sự muốn sử dụng. Xem stackoverflow.com/a/31961397/608312 chẳng hạn.
Jake Lee

37

Bạn cũng có thể sử dụng ViewPager.SimpleOnPageChangeListenerthay vì ViewPager.OnPageChangeListenervà ghi đè chỉ những phương thức bạn muốn sử dụng.

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

Hy vọng điều này giúp đỡ :)

Chỉnh sửa: Theo API Android, setOnPageChangeListener (ViewPager.OnPageChangeListener listener)không được dùng nữa. Vui lòng kiểm tra url này: - API ViewPager của Android


1
Như mViewPager.setOnPageChangeListener();bị phản đối tại, chương trình này đang làm việc tốt.
BST Kaal

Trong đoạn mã trên, để phát hiện xem trạng thái đã thay đổi hay chưa, hãy lưu vị trí hiện tại và so sánh nó khi trang được cuộn trong phương thức onPageScrolled.
AnupamChugh

14

Người dùng 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) {
            }
        })

Cập nhật 2020 cho 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

Đối với ViewPager2,

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

trong đó OnPageChangeCallbackmột lớp tĩnh với ba phương thức:

onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels),
onPageSelected(int position), 
onPageScrollStateChanged(@ScrollState int state)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.