【问题标题】:Determine when a ViewPager changes pages确定 ViewPager 何时更改页面
【发布时间】:2012-07-02 20:17:18
【问题描述】:

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

previous SO answer 中给出的代码似乎不起作用:

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

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

}

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

【问题讨论】:

标签: android android-widget android-viewpager


【解决方案1】:

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

【讨论】:

  • 你可以使用 SimpleOnPageChangeListener 并且只覆盖 onPageSelected
【解决方案2】:

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

        }
    });

【讨论】:

  • 我好像不明白。我是一个绝对的初学者。那么我们在这些方法中放了什么。请帮助我了解在哪里学习addOnPageChangeListener
  • +1 获取信息,但是上面提到的这两个ViewPager.SimpleOnPageChangeListenerViewPager.OnPageChangeListener 有什么区别?
  • @RoCk 使用 SimpleOnPageChangeListener,您只需要覆盖您实际想要使用的方法。例如,请参阅stackoverflow.com/a/31961397/608312
【解决方案3】:

您也可以使用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

【讨论】:

  • 由于mViewPager.setOnPageChangeListener(); 现在已被弃用,这个工作正常。
  • 在上面的代码中,为了检测状态是否改变,保存当前位置并在页面滚动时在onPageScrolled方法中进行比较。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多