上一篇
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的视图
,
这一点需要理解注意了
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的使用也挺简单的,关键是要明白它的含义和使用场景~