The FragmentPagerAdapter
除了显示的片段之外,还将其他片段保持在恢复状态。解决方案是实现自定义OnPageChangeListener
并为显示片段时创建一个新方法。
1)创建LifecycleManager
界面
该接口将有两个方法,每个方法ViewPager’s
Fragment 将实现它。这些方法如下:
public interface FragmentLifecycle {
public void onPauseFragment();
public void onResumeFragment();
}
2)让每个Fragment
实现接口
为每个类声明添加 iplements 语句:
public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle
3)在每个fragment中实现接口方法
为了检查它是否确实按预期工作,我将记录方法调用并显示 Toast:
@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();
}
4)ViewPager页面变化时调用接口方法
您可以在 ViewPager 上设置 OnPageChangeListener 并在每次 ViewPager 显示另一个页面时获取回调:
pager.setOnPageChangeListener(pageChangeListener);
5) 实现 OnPageChangeListener 来调用您的自定义 Lifecycle 方法
Listener知道新的位置,并且可以在PagerAdapter的帮助下调用新Fragment的接口方法。我可以在这里为新片段调用 onResumeFragment() ,并为当前片段调用 onPauseFragment() 。
我还需要存储当前片段的位置(最初当前位置等于 0),因为我不知道用户是从左向右滚动还是从右向左滚动。看看我在代码中的意思:
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
public void onPageScrollStateChanged(int arg0) { }
};
代码不是我写的。完整教程在这里:http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-include-source-code/ http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/