确定ViewPager何时更改页面

171

我有一个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
5个回答

328

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

54
你可以使用SimpleOnPageChangeListener,只需要重写onPageSelected方法。 - clocksmith

127

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

        }
    });

4
我似乎不太理解,我是一个绝对的初学者。那么我们要在这些方法中放什么?请帮助我了解如何学习addOnPageChangeListener - Karue Benson Karue
谢谢提供信息,但是如上所述,这两个 ViewPager.SimpleOnPageChangeListenerViewPager.OnPageChangeListener 有什么区别呢? - RoCkDevstack
2
使用SimpleOnPageChangeListener,您只需要覆盖您实际想要使用的方法。例如,请参见https://dev59.com/mmgu5IYBdhLWcg3we3Ct#31961397。 - Jake Lee

44

对于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)

40
你还可以使用 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
在上述代码中,要检测状态是否已更改,请保存当前位置并在onPageScrolled方法中滚动页面时进行比较。 - AnupamChugh

38

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接