ViewPager相当于容器,盛装View或者Fragment,可以使视图左右滑动。
一、在layout XML文件中如何加入ViewPager
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:....>
</android.support.v4.view.ViewPager>
二、在ViewPager中加载要显示的页卡
1.将layout布局转为View对象(两种方法)
(1)LayoutInflater If=getLayoutInflater().from(this);
If.inflate(resource,root);
(2)View.inflate(context,resource,root);
2.相关的适配器Adapter(两类——View、Fragment(业务逻辑复杂时推荐使用Fragment)) 新建类继承于下列某个Adapter,如MyPagerAdapter,然后重写相关的方法
(1)PagerAdapter 数据源:List<View> //三个三个页面的加载
(2)FragmentPagerAdapter 数据源:List<Fragment> //所有页面一次都加载进来
(3)FragmentStatePagerAdapter 数据源:List<Fragment> //三个三个页面的加载,需重写instantiateItem、destroyItem方法,但函数内容不需改写
Adapter里面的常用方法:
(1)getCount()需要返回所有页卡的数量
(2)isViewFromObject(View arg0,Object arg1) 判断视图是否由对象产生 官方做法是 return arg0==arg1;
(3)instantiateItem(ViewGroup container,int position) 实例化一个页卡
(4)destroyItem(ViewGroup container,int position,Object object) 销毁一个页卡
(5)getPageTitle(int position) 返回页面标题信息
示例:
public class MyPageAdapter extends PagerAdapter{
private List<View>viewList;
public MyPageAdapter(List<View>viewList) {
this.viewList=viewList;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return viewList.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}
//实例化一个页卡,用来显示
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(viewList.get(position));
return viewList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(viewList.get(position));
}
}
三、像微信一样给每个页卡添加一个标签 与ViewPager控件在同一个布局文件中
1.在ViewPager内添加一个PagerTabStrip(下面有线)或者PagerTitleStrip(下面没有线),并存时,前者会失效
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
>
<android.support.v4.view.PagerTabStrip
android:id="@+id/tab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
>
<span style="white-space:pre"> </span></android.support.v4.view.PagerTabStrip> //注意:在ViewPager标签内
</android.support.v4.view.ViewPager>
2.声明一个PagerTabStrip 对象如tab
3.声明一个List<String> 变量 如 new ArrayList<String>, 向其添加页卡的标题内容
4.在MyPagerAdapter的构造函数中添加一个参数List<String> titleList 来传入标题
5.可以通过tab变量修改PagerTabStrip的属性
(1)tab.setBackgroundColor(Color.YELLOW);
(2)tab.setTextColor(Color.RED);
(3)tab.setDrawFullUnderline(false); //将下面的长线取消掉,即不显示
(4)tab.setTabIndicatorColor(Color.BLUE); //设置下面的小粗线
实例
viewList=new ArrayList<View>();
titleList=new ArrayList<String>();
View view1 = View.inflate(this, R.layout.view1, null);
View view2 = View.inflate(this, R.layout.view2, null);
View view3 = View.inflate(this, R.layout.view3, null);
View view4 = View.inflate(this, R.layout.view4, null);
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
viewList.add(view4);
titleList.add("第一个页面");
titleList.add("第二个页面");
titleList.add("第三个页面");
titleList.add("第四个页面");
pager=(ViewPager) findViewById(R.id.pager);
tab=(PagerTabStrip) findViewById(R.id.tab);
MyPageAdapter adapter=new MyPageAdapter(viewList,titleList);
pager.setAdapter(adapter);
四、FragmentPagerAdapter的使用
1.新建3个Fragment派生类,重写onCreateView()方法。
2.初始化List<Fragment> fragLis=new ArrayList<Fragment>();
3.将1中的三个派生类对象添加进fragList中,如 fragListl.add(new Fragment1());
4.配置Fragment的数据适配器,新建一个FragmentPagerAdapter派生类(成员数据List<Fragment>fragList; List<String> titleList),重写父类的方法
(1)构造函数,参数中增加fragList和titleList;
(2)Fragment getItem(int arg0);
(3)public int getCount()
(4)public CharSequence getPageTitle(int position) {return titleList.get(position);}
5.为了支持support.v4下的FragmentPagerAdapter,MainActivity需继承于FragmentActivity,
MyFragmentPagerAdapter adapter=new MyFragmentPagerAdapter(getSupportFragmentManager,fragList, titleList);
6.pager.setAdapter(adapter);
五、监听器的使用
接口:OnPageChangeListener 监听切换页卡是切换到多少页,从0开始计数