首先需要一个FragmentPagerAdapter。这个是Andbase下封装的一个Adapter源码。
public class AbFragmentPagerAdapter extends FragmentPagerAdapter {
/** The m fragment list. */
private ArrayList<Fragment> mFragmentList = null;
/**
* Instantiates a new ab fragment pager adapter.
* @param mFragmentManager the m fragment manager
* @param fragmentList the fragment list
*/
public AbFragmentPagerAdapter(FragmentManager mFragmentManager,ArrayList<Fragment> fragmentList) {
super(mFragmentManager);
mFragmentList = fragmentList;
}
/**
* 描述:获取数量.
*
* @return the count
* @see android.support.v4.view.PagerAdapter#getCount()
*/
@Override
public int getCount() {
return mFragmentList.size();
}
/**
* 描述:获取索引位置的Fragment.
*
* @param position the position
* @return the item
* @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
*/
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
if (position < mFragmentList.size()){
fragment = mFragmentList.get(position);
}else{
fragment = mFragmentList.get(0);
}
return fragment;
}
}
在代码中使用:
pagerItemList = new ArrayList<Fragment>();
mFragmentPagerAdapter = new AbFragmentPagerAdapter
(mFragmentManager,
pagerItemList);
mViewPager.setAdapter(mFragmentPagerAdapter);
这么使用后就可以实现一个每一页都是Fragment的ViewPager。在使用时添加日志可以看到。刚进入时,会初始化前两个Fragment,前两个Fragment都会调用fragmen如下方法。
Fragment1,2
LogUtils--> onAttach()
LogUtils--> onCreate()
LogUtils--> onViewCreated()
LogUtils--> onActivityCreated()
LogUtils--> onStart()
LogUtils--> onResume()
往右滑动一个后,显示Fragment2时,会调用第三个fragment的方法:
Fragment3
LogUtils--> onAttach()
LogUtils--> onCreate()
LogUtils--> onViewCreated()
LogUtils--> onActivityCreated()
LogUtils--> onStart()
LogUtils--> onResume()
当再往右滑动显示Fragment3时,会调用第四个Frament的生命周期。同时Fragment1会调用如下方法
Fragmen1:
LogUtils--> onPause()
LogUtils--> onStop()
LogUtils--> onDestroyView()
可以看出Fragment1的View被销毁了。
这是因为viewpager默认只会保留当前显示页,前一页与后一页的界面。
可以调用viewpager的如下方法设置保留的个数,默认值是1,正如它的注释一样这个数不能设置的太大了。
/**
* Set the number of pages that should be retained to either side of the
* current page in the view hierarchy in an idle state. Pages beyond this
* limit will be recreated from the adapter when needed.
*
* <p>This is offered as an optimization. If you know in advance the number
* of pages you will need to support or have lazy-loading mechanisms in place
* on your pages, tweaking this setting can have benefits in perceived smoothness
* of paging animations and interaction. If you have a small number of pages (3-4)
* that you can keep active all at once, less time will be spent in layout for
* newly created view subtrees as the user pages back and forth.</p>
*
* <p>You should keep this limit low, especially if your pages have complex layouts.
* This setting defaults to 1.</p>
*
* @param limit How many pages will be kept offscreen in an idle state.
*/
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}
当从第3个滑动到第二个后,会调用第一个Fragment的
LogUtils--> onViewCreated()
LogUtils--> onActivityCreated()
LogUtils--> onStart()
LogUtils--> onResume()
viewpager上面添加了对应的标签,每一个点击调转对应的页面(Fragment)。这样直接从第三个点击第一个时,Fragment1的生命周期如下:
LogUtils--> onViewCreated()
LogUtils--> onActivityCreated()
LogUtils--> onStart()
LogUtils--> onResume()
现在还没有搞清楚为什么从第三个Fragment滑动到第二个Fragment,与从第三个直接点击第一个Fragment显示时,Fragment1的生命周期不一致。滑动时没有调用onViewCreated 和onActivityCreated。不过根据日志明确了其生命周期调用就能在相应的方法中执行自己想要的操作了。