确定ViewPager何时更改页面


146

我在ViewPager中有三个页面(片段),但是我只想显示其中两个页面的菜单项。

先前的SO答案中给出的代码似乎无效:

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

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

}

Eclipse表示不需要@Override,也无法设置super。它从未被系统调用,即使这是我如何确定当前显示的页面呢?我可以在这里帮忙吗?


1
这对我有用,并提供了一些有关如何使用给定解决方案的上下文:检测Fragment内的ViewPager选项卡更改
gcl1 2012年

Answers:


282

使用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
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.SimpleOnPageChangeListenerViewPager.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) { }
});

希望这个帮助:)

编辑: 根据android API,setOnPageChangeListener (ViewPager.OnPageChangeListener listener)已弃用。请检查以下网址:-Android ViewPager API


1
正如mViewPager.setOnPageChangeListener();现在不推荐使用的那样,此功能运行良好。
BST Kaal 2015年

在上面的代码中,要检测状态是否已更改,请保存当前位置并在onPageScrolled方法中滚动页面时进行比较。
AnupamChugh '18

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

ViewPager2的2020更新

        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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.