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開始計數