Android中ViewPager使用FragmentPagerAdapter(底部圆点)

原文地址:http://blog.csdn.net/tu_bingbing/article/details/8756935


    上一篇 http://blog.csdn.net/tibib/article/details/8753769简单的介绍了下ViewPager的使用,上一次使用的是PagerAdapter来生成适配每一页,但最常用的是   FragmentPagerAdapter FragmentStatePagerAdapter , FragmentPagerAdapter , and  FragmentStatePagerAdapter  这几种适配器,分别在 API 4+ Support   和 API 13+ Support  上提供。效果图如下:



     使用 Fragment 来表示一页,显得更加简单和直观, Fragment  本身提供的一些特性可以让我们方便的对每一页进行管理,使用FragmentManager可以根据ID或TAG来查找 Fragment , 动态添加、删除、替换, Fragment  可以管理自己的生命周期,像Activity一样提供了一些生命周期回调方法。    

     让 Fragment 成为ViewPager的一页时,FragmentManager会一直保存管理创建好了的Fragment,即使当前不是显示的这一页,Fragment对象也不会被销毁,在后台默默等待重新显示。但如果Fragment不再可见时,它的视图层次会被销毁掉,下次显示时视图会重新创建。

     出于使用 FragmentPagerAdapter   时,Fragment对象会一直存留在内存中,所以当有大量的显示页时,就不适合用 FragmentPagerAdapter  了, FragmentPagerAdapter   适用于只有少数的page情况,像选项卡。这个时候你可以考虑使用 FragmentStatePagerAdapter    ,当使用 FragmentStatePagerAdapter   时,如果Fragment不显示,那么Fragment对象会被销毁,但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来, FragmentStatePagerAdapter    比较适合页面比较多的情况,像一个页面的ListView    
  

     最后一点要注意,当使用 FragmentPagerAdapter 时一定要为它的宿主ViewPager设置一个有效的ID ! 

     下面是一个使用 FragmentPagerAdapter 的示例,需要注意的是destroyItem()方法并不是去 Destroy Fragment对象 而是 Destroy的是Fragment的视图  ,   这一点需要理解注意了
  1. class MyFragmentPagerAdapter extends FragmentPagerAdapter{  
  2.   
  3.     public MyFragmentPagerAdapter(FragmentManager fm) {  
  4.         super(fm);  
  5.     }  
  6.   
  7.     @Override  
  8.     public Fragment getItem(int position) {  
  9.         return MyPageFragment.create(position);  
  10.     }  
  11.   
  12.     @Override  
  13.     public int getCount() {  
  14.         return mPagerNum; // 代表页数  
  15.     }  
  16.       
  17.     @Override  
  18.     public void destroyItem(ViewGroup container, int position, Object object) {  
  19.         // 这里Destroy的是Fragment的视图层次,并不是Destroy Fragment对象  
  20.         super.destroyItem(container, position, object);  
  21.         Log.i("INFO""Destroy Item...");  
  22.     }  
  23. }  


     下面是一个Fragment的示例程序,记得前面说过,使用 FragmentPagerAdapter 适配器时,创建好了的Fragment会一直在内存中,不会被销毁,但它的视图层次是会被销毁的,所以onCreate()方法只会被调用一次,而  onCreateView() 方法,每次 Fragment从不可见到可见时会被调用,可以看到Fragment有一些生命周期回调方法 onPause()、onDestroy()等等
  1. public class MyPageFragment extends Fragment {  
  2.   
  3.     public static final String ARG_PAGE = "page_num";  
  4.   
  5.     // 当前页  
  6.     private int currentPageNum;  
  7.   
  8.     public MyPageFragment() {  
  9.     }  
  10.   
  11.     public static MyPageFragment create(int pagerNum) {  
  12.   
  13.         MyPageFragment myPageFrament = new MyPageFragment();  
  14.         Bundle arg = new Bundle();  
  15.         arg.putInt(ARG_PAGE, pagerNum);  
  16.         myPageFrament.setArguments(arg);  
  17.   
  18.         return myPageFrament;  
  19.   
  20.     }  
  21.   
  22.       
  23.     /* (non-Javadoc) 
  24.      * @see android.support.v4.app.Fragment#onCreate(android.os.Bundle) 
  25.      *  
  26.      * Fragment创建的时候调用 
  27.      *  
  28.      */  
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         Log.i("INFO""onCreate..");  
  33.         currentPageNum = getArguments().getInt(ARG_PAGE);  
  34.     }  
  35.   
  36.     /* (non-Javadoc) 
  37.      * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) 
  38.      *  
  39.      * Fragment从不可见到可见时调用 
  40.      *  
  41.      */  
  42.     @Override  
  43.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  44.             Bundle savedInstanceState) {  
  45.   
  46.         Log.i("INFO""onCreateView..");  
  47.           
  48.         ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.per_pager1,  
  49.                 container, false);  
  50.   
  51.         switch (currentPageNum) {  
  52.         case 0:  
  53.             rootView.setBackgroundResource(R.drawable.page1_bg);  
  54.             break;  
  55.         case 1:  
  56.             rootView.setBackgroundResource(R.drawable.page2_bg);  
  57.             break;  
  58.         case 2:  
  59.             rootView.setBackgroundResource(R.drawable.page3_bg);  
  60.             break;  
  61.         default:  
  62.             break;  
  63.         }  
  64.   
  65.         return rootView;  
  66.   
  67.     }  
  68.       
  69.     @Override  
  70.     public void onPause() {  
  71.         super.onPause();  
  72.     }  
  73.       
  74.     @Override  
  75.     public void onDestroy() {  
  76.         super.onDestroy();  
  77.         Log.i("INFO""MyFragment Destroy...");  
  78.     }  
  79.   
  80. }  

     ViewPager的使用跟上一篇介绍的是一样的,这里就不介绍了,FragmentPagerAdapter的使用也挺简单的,关键是要明白它的含义和使用场景~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值