ViewPager的应用场景
应用开头的引导界面
类似于“微信”或者“今日头条”标签页之间的切换
使用步骤
第一步:在布局文件中加入ViewPager组件,并在代码中获得该组件
<android.support.v4.view.ViewPager
android:id="@+id/bbs_center_viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
第二步:为ViewPager添加适配器,ViewPager可以有三种类型的适配器
PagerAdapter:使用较少,所以没有去了解
FragmentPagerAdapter:适用于Fragment比较少的情况下,因为这个适配器会将访问过得Fragment都保存在内存中,当Fragment较多时对内存的消耗就会比较大。
FragmentStatePagerAdapter:适用于Fragment较多的情况下。当整个Fragment不再被访问,它将被销毁
示例代码:
public class ExamplePagerAdapter extends FragmentStatePagerAdapter{
List<Fragment> fragments;
String[] titles;
//fragments里是ViewPager所有要显示的Fragment的集合,titles是所有标签页的名字的集合
public ExamplePagerAdapter(FragmentManager fm, List<Fragment> fragments, String[] titles) {
super(fm);
this.fragments = fragments;
this.titles = titles;
}
//此ViewPager一共有多少个标签页可以滑动
@Override
public int getCount() {
return fragments.size();
}
//通过此方法返回对应位置标签页用到的fragment
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
//通过此方法指定每个标签页的名字
@Override
public CharSequence getPageTitle(int position) {
return titles[position];
}
}
第三步:为ViewPager绑定适配器,传入参数
ViewPager viewPager = (ViewPager) findViewById(R.id.bbs_center_viewPager);
ExamplePagerAdapter pagerAdapter = new ExamplePagerAdapter (getSupportFragmentManager(), posts, titles);
viewPager.setAdapter(pagerAdapter );
第四步:为ViewPager绑定监听器
<!-- 监听器的写法以后补上 -->
其他
1.通过ViewPager控制显示第几个标签页:
@Override
public void onBackPressed() {
if (mPager.getCurrentItem() == 0) {
// If the user is currently looking at the first step, allow the system to handle the
// Back button. This calls finish() on this activity and pops the back stack.
super.onBackPressed();
} else {
// Otherwise, select the previous step.
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
2.在使用FragmentStatePagerAdapter作为适配器的情况下保存Fragment的状态
当使用FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁(滑过后会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉)。但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来,