zoukankan      html  css  js  c++  java
  • Android中ViewPager使用FragmentPagerAdapter(底部圆点)


         上一篇 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      

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

         下面是一个使用 FragmentPagerAdapter 的示例,需要注意的是destroyItem()方法并不是去 Destroy Fragment对象 而是 Destroy的是Fragment的视图  ,   这一点需要理解注意了
    	class MyFragmentPagerAdapter extends FragmentPagerAdapter{
    
    		public MyFragmentPagerAdapter(FragmentManager fm) {
    			super(fm);
    		}
    
    		@Override
    		public Fragment getItem(int position) {
    			return MyPageFragment.create(position);
    		}
    
    		@Override
    		public int getCount() {
    			return mPagerNum; // 代表页数
    		}
    		
    		@Override
    		public void destroyItem(ViewGroup container, int position, Object object) {
    			// 这里Destroy的是Fragment的视图层次,并不是Destroy Fragment对象
    			super.destroyItem(container, position, object);
    			Log.i("INFO", "Destroy Item...");
    		}
    	}


         下面是一个Fragment的示例程序,记得前面说过,使用 FragmentPagerAdapter  适配器时,创建好了的Fragment会一直在内存中,不会被销毁,但它的视图层次是会被销毁的,所以onCreate()方法只会被调用一次,而  onCreateView()  方法,每次 Fragment从不可见到可见时会被调用,可以看到Fragment有一些生命周期回调方法 onPause()、onDestroy()等等
    public class MyPageFragment extends Fragment {
    
    	public static final String ARG_PAGE = "page_num";
    
    	// 当前页
    	private int currentPageNum;
    
    	public MyPageFragment() {
    	}
    
    	public static MyPageFragment create(int pagerNum) {
    
    		MyPageFragment myPageFrament = new MyPageFragment();
    		Bundle arg = new Bundle();
    		arg.putInt(ARG_PAGE, pagerNum);
    		myPageFrament.setArguments(arg);
    
    		return myPageFrament;
    
    	}
    
    	
    	/* (non-Javadoc)
    	 * @see android.support.v4.app.Fragment#onCreate(android.os.Bundle)
    	 * 
    	 * Fragment创建的时候调用
    	 * 
    	 */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		Log.i("INFO", "onCreate..");
    		currentPageNum = getArguments().getInt(ARG_PAGE);
    	}
    
    	/* (non-Javadoc)
    	 * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)
    	 * 
    	 * Fragment从不可见到可见时调用
    	 * 
    	 */
    	@Override
    	public View onCreateView(LayoutInflater inflater, ViewGroup container,
    			Bundle savedInstanceState) {
    
    		Log.i("INFO", "onCreateView..");
    		
    		ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.per_pager1,
    				container, false);
    
    		switch (currentPageNum) {
    		case 0:
    			rootView.setBackgroundResource(R.drawable.page1_bg);
    			break;
    		case 1:
    			rootView.setBackgroundResource(R.drawable.page2_bg);
    			break;
    		case 2:
    			rootView.setBackgroundResource(R.drawable.page3_bg);
    			break;
    		default:
    			break;
    		}
    
    		return rootView;
    
    	}
    	
    	@Override
    	public void onPause() {
    		super.onPause();
    	}
    	
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    		Log.i("INFO", "MyFragment Destroy...");
    	}
    
    }

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







  • 相关阅读:
    Hadoop生态圈-Azkaban实战之Command类型执行指定脚本
    Hadoop基础-MapReduce的排序
    Hadoop生态圈-Azkaban实战之Command类型多job工作流flow
    Hadoop生态圈-Azkaban部署实战
    SHELL脚本编程循环篇-until循环
    Hadoop生态圈-Kafka配置文件详解
    Hadoop生态圈-使用Kafka命令在Zookeeper中对应关系
    Hadoop生态圈-Kafka的旧API实现生产者-消费者
    Apache Kafka运维常用命令
    企业级Apache Kafka部署实战篇
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2998633.html
Copyright © 2011-2022 走看看