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的使用也挺简单的,关键是要明白它的含义和使用场景~







 

posted @ 2013-04-03 19:57  xinyuyuanm  阅读(528)  评论(0编辑  收藏  举报