具体使用思路
//第一步 新建一个view1.xml对象
//第二步 配置好属性后 在layout文件夹下复制多几个view2,3,4
//第三步 在MainActivity中view1,2,3,4转为View对象、并作为数据源
List<View>viewList=new ArrayList<View>();
//第四步 把布局转成View对象
View view1 = View.inflate(this, R.layout.view1, null);
//第五步 放在数据源集合
viewList.add(view1);
//第六步 新建类MyPagerAdapter 继承PagerAdapter
getCount()//计数方法
return viewList.getSize();//返回页卡数量
isViewFromObject(View arg0,Object arg1);//View是否来自对象
return arg0==arg1;//官方用法
instantiateItem(ViewGroup container,int position);//实例化一个页卡
container.addView(viewList.get(position));//添加当前对象
return viewList.get(position);//返回当前对象
destroyItem(ViewGroup container,int position,Object object);//销毁一个页卡
contianer.removeView(viewList.get(position));//返回当前销毁对象
//第七步 回到MainActivity创建PagerAdapter适配器
//第八步 写好一个ViewPager 传到Activity 然后初始化
//第九步 给ViewPager加载适配器
ViewPager:为ViewPager设置标题:
//1.在ViewPager容器xml文件中添加子标签
<android.support.v4.view.PagerTabStrip>
</android.support.v4.view.PagerTabStrip>
//2.创建集合并将标题添加入titleList集合
List<String>titleList=new ArrayList<String>();
//3.将titleList传到实例化适配器中的方法来,并在PagAdapter类构造函数中初始化
//4.在PageAdapter类中添加一个函数:
getPageTitle(int position),return titleList.get(position);
//5.初始化PagerTabStrip可以为PagerTabStrip设置一下属性:
tab.setBackgroundColor(Color.YELLOW);
tab.setTextColor(Color.RED);
tab.setDrawFullUnderline(false);
tab.setTabIndicator(Color.GREEN);
//6.与tabStrip类似,设置底部标题,两个同时使用前者有效,一般不一起使用
<android.support.v4.view.PagerTitleStrip>
</android.suppot.v4.view.PagerTitleStrip>
注:
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要用 LayoutInflater.inflate() 来载入
2、对于一个已经载入的界面,就可以使用 Activiyt.findViewById() 方法来获得其中的界面元素。
获得 LayoutInflater 实例的三种方式
1. LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()
2. LayoutInflater localinflater =(LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
3. LayoutInflater inflater = LayoutInflater.from(context);
结论:所以这三种方式最终本质是都是调用的Context.getSystemService()。
ViewPager有三个适配器,适配不同的数据源
1、继承自PagerAdapter的适配器适配List< View>的数据
2、继承自FragmentAdapter的适配器适配List< Fragment>的数据
3、继承自FragmentStateAdapter的适配器适配List< Fragment>的数据
其中后两种的区别是:2没有创建和销毁的过程,3有
FragmentPagerAdater为适配器加载ViewPager
1. Activity布局文件中添加
<android.support.v4.view.ViewPager>
</android.suppot.v4.view.ViewPager>
- 初始化数据源
(1)List< Fragment>数据源
fragList = new ArrayList< Fragment>();
fragList.add(new Fragment1());
fragList.add(new Fragment2());
(2)初始化Tab title数据源
titleList = new ArrayList< String>();
titleList.add("FirstFrag");
titleList.add("SecondFrag");
3.新建一个FragmentPagerAdapter适配器,并重写构造函数和其他的函数
public MyFragemntPagerAdapter(FragmentManager fm, List< Fragment> fragList, List< String> titleList) {
super(fm);
this.fragList = fragList;
this.titleList = titleList;
}
4.在Activity中创建适配器,构造函数中将fragList、titleList都传递进去
MyFragemntPagerAdapter adapter = new MyFragemntPagerAdapter(getSupportFragmentManager(), fragList, titleList);
5.加载适配器
viewPager.setAdapter(adapter);
6.注意
(1)需要新建几个Fragment类来将Layout布局转换成View对象。最后再由List< Fragment>添加进来。
(2)在FragmentPagerAdapter中,所有的页卡是一次创建的,并不会销毁
(3)FragmentStatePagerAdapter,用法和FragmentPagerAdapter一样,只是需要添加
instantiateItem(),destroyItem(),且不需要改
(4)FragmentStatePagerAdapter的区别在于页卡是每次创建3个
OnPageChangeListener滑动事件监听器
//需要三个方法
public void onPageScrollStateChanged(int arg0) {
//arg0 ==1是正在滑动,arg0==2是滑动完毕了,arg0==0是什么都没做,就是停在那。
//onPageScrollStateChanged的参数 0表示滑动完毕 1表示按下状态 2表示手指抬起状态
}
public void onPageScrolled(int arg0, float arg1, int arg2) {
//表示在前一个页面滑动到后一个页面的时候,在前一个页面滑动前调用的方法。
onPageScrolled(int arg0,float arg1,int arg2);
/**
* 当页面在滑动的时候会调用此方法,在滑动被停止之前,
* 此方法会一直得到调用。其中三个参数的含义分别为:
* arg0 :当前页面,及你点击滑动的页面
* arg1:当前页面偏移的百分比
* arg2:当前页面偏移的像素位置
*/
}
public void onPageSelected(int arg0) {
//arg0是表示你当前选中的页面,这事件是在你页面跳转完毕的时候调用的。
//arg0是从0开始计数的
}
注:
1.OnPageChangeListener()——用来监控ViewPager滑动到第几页,position是从零开始计数;
Toast.makeText(this,"当前是第"+(arg0+1)+"个页面", Toast.LENGTH_SHORT).show();
2.在我们的工作中,使用 Fragment 填充 ViewPager 更加常见,即使用 FragmentPagerAdapter 或者 FragmentStatePagerAdapter ,因为Fragment比View拥有更加全面的生命周期,而如果我们使用PagerAdapter,就是直接使用View来填充ViewPager,这种做法不常用。
切换页卡的监听器:
1.OnPageChangListener,其中最常用的函数是onPageSelected(int arg0);
2.Fragment生命周期比较全,以fragment为资源的ViewPager比较好控制,适用于逻辑比较复杂的情况,如果只是为了展示则推荐以view为资源的viewPager比较好开发
下面奉上原始代码:
MainActivity.java :主函数
package com.example.viewpager;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerTabStrip;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends FragmentActivity implements
OnPageChangeListener {
private List<View> viewList;// 新建数据源集合viewlist
private ViewPager pager;
private PagerTabStrip tab;// 附属于pager的子标签
private List<String> titleList;// 标签名字集合
private List<Fragment> fragList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 初始化viewList集合
viewList = new ArrayList<View>();
// 布局转变对象的方法
/**
* 通过view对象去作为ViewPager的数据源
*/
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);
/**
* 通过Fragment作为ViewPager的数据源
*/
fragList = new ArrayList<Fragment>();
fragList.add(new Fragment1());
fragList.add(new Fragment2());
fragList.add(new Fragment3());
fragList.add(new Fragment4());
// 为ViewPager页卡设置标题
titleList = new ArrayList<String>();
titleList.add("第一页");
titleList.add("第二页");
titleList.add("第三页");
titleList.add("第四页");
// 为PagerTabStrip设置一些属性
tab = (PagerTabStrip) findViewById(R.id.tab);
tab.setBackgroundColor(Color.YELLOW);
tab.setTextColor(Color.RED);
tab.setDrawFullUnderline(false);// 把长线去掉
tab.setTabIndicatorColor(Color.BLACK);// 长线上面的小粗线
// 初始化ViewPager
pager = (ViewPager) findViewById(R.id.pager);
// 创建PagerAdapter的适配器
MyPagerAdapter adapter = new MyPagerAdapter(viewList, titleList);
// viewPager加载适配器
// pager.setAdapter(adapter);
//第二个适配器
MyFragmentPagerAdapter adapter2 = new MyFragmentPagerAdapter(
getSupportFragmentManager(), fragList, titleList);
pager.setAdapter(adapter2);
pager.setOnPageChangeListener(this);//OnPageChangeListener滑动事件监听器
}
/**
* OnPageChangeListener滑动事件监听器三大方法
*/
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "当前是第" + (arg0 + 1) + "个页面", Toast.LENGTH_SHORT).show();
}
}
MyPagerAdapter.java
package com.example.viewpager;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
public class MyPagerAdapter extends PagerAdapter {
private List<View> viewList;
private List<String> titleList;
public MyPagerAdapter(List<View> viewList, List<String> titleList) {
this.viewList = viewList;
this.titleList = titleList;
}
/**
* 返回的是页卡的数量
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
return viewList.size();
}
/**
* view是否来自于对象
*/
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;// 官方作法
}
/**
* 实例化一个页卡
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
container.addView(viewList.get(position));
// position是当前位置
return viewList.get(position);
}
/**
* 销毁一个页卡
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView(viewList.get(position));
}
/**
* 设置viewpager页卡的标题
*/
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titleList.get(position);
}
}
MyFragmentPagerAdapter.java
package com.example.viewpager;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragList;
private List<String> titleList;
public MyFragmentPagerAdapter(FragmentManager fm
,List<Fragment> fragList,List<String> titleList) {
super(fm);
// TODO Auto-generated constructor stub
this.fragList = fragList;
this.titleList = titleList;
}
/**
* 得到当前页卡的序号 从0开始
*/
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fragList.get(arg0);
}
/**
* 设置viewpager页卡的标题
*/
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titleList.get(position);
}
/**
* 返回的是页卡的数量
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
return fragList.size();
}
}
xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<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" >
</android.support.v4.view.PagerTabStrip>
<!--
<android.support.v4.view.PagerTitleStrip
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom" >
</android.support.v4.view.PagerTitleStrip>
-->
</android.support.v4.view.ViewPager>
</LinearLayout>