不推荐使用 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() 似乎不起作用