不推荐使用 viewpager setonpagechangelistener

Posted

技术标签:

【中文标题】不推荐使用 viewpager setonpagechangelistener【英文标题】:viewpager setonpagechangelistener deprecated 【发布时间】:2015-09-01 06:54:13 【问题描述】:

今天我尝试设置 ViewPager.setOnPageChangeListener,但我发现它已被弃用。

【问题讨论】:

顺便说一句,此方法已弃用。改用 addOnPageChangeListener(OnPageChangeListener) 和 removeOnPageChangeListener(OnPageChangeListener)。,来自文档 【参考方案1】:

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) 

        
    );

你可以找到这个Here.

【讨论】:

Eclipse好像连addOnPageChangeListener这个方法都找不到,请问这是哪个支持库的? 我认为 clearOnPageChangeListeners() 值得在这里提及,因此在使用 addOnPageChangeListener() 时不会出现多个监听器。 这令人困惑。如果他们保持相同的语法并简单地将这个调用或其他东西替换为更新版本,那就太好了。【参考方案2】:

这对我有用:

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)        
        conterchange.setText(""+(1+position));
    

    @Override
    public void onPageSelected(int position) 
    

    @Override
    public void onPageScrollStateChanged(int state) 
    
);

【讨论】:

【参考方案3】:

使用 ViewPager.addOnPageChangeListener 而不是 ViewPager.setOnPageChangeListener

【讨论】:

【参考方案4】:

以防万一有人需要 kotlin 中的解决方案:

viewPager.addOnPageChangeListener (object: ViewPager.OnPageChangeListener 
        override fun onPageScrollStateChanged(state: Int) 
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        

        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) 
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        

        override fun onPageSelected(position: Int) 
            TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
        

    )

【讨论】:

【参考方案5】:

您可以通过SimpleOnPageChangeListener实现 下面是代码:

private Fragment page = null;
/** Defining a listener for pageChange */
        ViewPager.SimpleOnPageChangeListener pageChangeListener = new ViewPager.SimpleOnPageChangeListener()
            @Override
            public void onPageSelected(int position) 
                super.onPageSelected(position);

                page = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.pager_selectPhotos + ":" + position);

                System.out.println(page);
                switch (position) 
                case 0:

                    break;
                case 1:

                    break;

                default:
                    break;
                
            
        ;
        /** Setting the pageChange listener to the viewPager */
        _pager.setOnPageChangeListener(pageChangeListener);

【讨论】:

Question 是 deprecated setOnPageChangeListener 函数的替代方案。【参考方案6】:

    如果需要,创建一个接口;

    public interface FragmentLifecycle 
    public void onPauseFragment();
    public void onResumeFragment();
    

    在viewpager的每个片段中实现接口,如图所示

 public class FragmentCast extends Fragment implements FragmentLifecycle 
  @Override
    public void onPauseFragment() 
        Log.i(TAG, "onPauseFragment()");
        Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show();
    

    @Override
    public void onResumeFragment() 
        Log.i(TAG, "onResumeFragment()");
        Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show();
    

    列出这是你如何使用 addOnPageListener

    进入 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() int currentPosition = 0;

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) 
    
        
    
        @Override
        public void onPageSelected(int position) 
    
    
            FragmentLifecycle   fragmentLifecycleToShow =(FragmentLifecycle) viewPager.getAdapter().instantiateItem(viewPager, viewPager.getCurrentItem());
            fragmentLifecycleToShow.onResumeFragment();
    
            FragmentLifecycle   fragmentLifecycleToHide =(FragmentLifecycle) viewPager.getAdapter().instantiateItem(viewPager, currentPosition);
            fragmentLifecycleToHide.onPauseFragment();
    
            currentPosition = position;
        
    
        @Override
        public void onPageScrollStateChanged(int state) 
    
        
    );
    

    在 onPauseFragment() 或 onResumeFragment() 中实现调用

【讨论】:

以上是关于不推荐使用 viewpager setonpagechangelistener的主要内容,如果未能解决你的问题,请参考以下文章

Fragment防止自动清理 (ViewPager滑动时,滑出屏幕后被清理)(转)

在 saveOnIstanceState() 之后 viewPager.setCurrentItem() 似乎不起作用

不使用 ViewPager 的 TabLayout

为啥 ViewPager 无限循环不起作用?

与 scrollView 一起使用时,ViewPager 的内部内容不可见 [关闭]

Viewpager 不清除片段