ViewPager和Fragment配合使用,以及它的Fragment生命周期分析

首先需要一个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。不过根据日志明确了其生命周期调用就能在相应的方法中执行自己想要的操作了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值