<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;"><android.support.v4.view.ViewPager</span>
android:id="@+id/vp_viewpage"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</android.support.v4.view.ViewPager>
v4是兼容包,解决向下兼容问题
转载请注明出处:http://blog.csdn.net/wei_chong_chong/article/details/50935578
加载显示的页卡
将Layout布局转换为View对象的两种方式
(1)LayoutInflater lf = getLayoutInflater().from(this);
lf.inflate(resource,root);
(2)View.inflate(context,resource,root);
ViewPager相当于一个容器,里面可以装两种东西:(1)Fragment,(2)view对象
配置Adapter
(1)ViewPagerAdapter数据源:List<View>
(2)FragmentPagerAdapter数据源:List<Fragment>
(3)FragmentStatePagerAdapter数据源:List<Fragment>
先来学习ViewPagerAdapter
如下所示先来说一下PageTabStrip和PagerTitleStrip
这两个是ViewPager的子级标签
是用来显示页面的标题的,一般使用其中一个就行了,如果两个同时写,这上面那个将会失效,实际开发过程中,我们只使用其中一个
<?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.support.v4.view.PagerTabStrip>
<android.support.v4.view.PagerTitleStrip
android:id="@+id/pagertitle"
android:layout_width="fill_parent"
android:layout_height="45dp"
android:layout_gravity="bottom" />
</android.support.v4.view.ViewPager>
</LinearLayout>
首先在MainActivity中
private ViewPager pager;
private List<View>viewList;
private List<String>titleList;
private PagerTabStrip tab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**
* 将Layout布局转换为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=new ArrayList<View>();
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
viewList.add(view4);
titleList=new ArrayList<String>();
titleList.add("第一页");
titleList.add("第二页");
titleList.add("第三页");
titleList.add("第四页");
tab=(PagerTabStrip) findViewById(R.id.tab);
//为PagerTabStrip设置一些属性
tab.setBackgroundColor(Color.YELLOW);//设置背景颜色
tab.setTabIndicatorColor(Color.BLUE);//设置下面短粗线的颜色
tab.setDrawFullUnderline(false);//消去下面的长线
//设置文字颜色
tab.setTextColor(Color.RED);
//初始化ViewPager
pager=(ViewPager) findViewById(R.id.pager);
//创建PagerAdapter的适配器
MyViewPagerAdapter adapter=new MyViewPagerAdapter(viewList, titleList);
//加载适配器
pager.setAdapter(adapter);
新建类创建适配器MayPagerAdapter,这里为每个页面添加了title
public class MyViewPagerAdapter extends PagerAdapter{
private List<View>viewList;
private List<String>titleList;
public MyViewPagerAdapter(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));
return viewList.get(position);
}
//删除销毁页面
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView(viewList.get(position));
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titleList.get(position);
}
}
Adapter里面的常用方法
(1)getCount()需要返回所有页面的shul
(2)isViewFromObject(View arg0,Object arg1)判断视图是否由对象产生
(3)instantiateItem(ViewGroup containter,int position)实例化界面
(4)destroyItem(ViewGroup container,int position,Object object)销毁页面
(5
getPageTitle(int postiton)返回页面标题信息
下面学习FragmentPagerAdapter
首先写四个myFragment类继承Fragment.,需要导入v4包下的Fragment
在MainActivity中初始化,注意:下面在使用MyFragmentPagerAdapter时
构造方法的第一个参数必须使用getSupportFragmentManager()方法获取Fragment管理者而不是getFragmentManager()方法,因为创建Fragment时使用的是v4兼容包,(为了配合v4兼容包)并且必须让MainActivity继承自FragmentActivity而不是Activity
fragList=new ArrayList<Fragment>();
fragList.add(new Fragment1());
fragList.add(new Fragment2());
fragList.add(new Fragment3());
fragList.add(new Fragment4());
<span style="white-space:pre"> </span>MyFragmentPagerAdapter adapter2=new MyFragmentPagerAdapter(getSupportFragmentManager(), fragList, titleList);
<span style="white-space:pre"> </span>pager.setAdapter(adapter2);<span style="white-space:pre"> </span>
创建myFragmentPagerAdapter
package com.example.android_viewpager;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;
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;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fragList.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fragList.size();
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titleList.get(position);
}
}
ViewPagerAdapter和FragmentPagerAdapter的区别:
ViewPagerAdapter是动态加载和销毁页面的:
ViewPagerAdapter当页面超过三个时,一次加载3个页面(1,2,3)当显示第三个页面时,第一个页面将被销毁,第四个页面会提前被加载
FragmentPageAdapter不会动态加载和销毁,它是一次性加载完所有的页面,当页面超过3个时不推荐使用
FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter。但是,和 FragmentPagerAdapter 不一样的是,正如其类名中的 'State' 所表明的含义一样,该 PagerAdapter 的实现将只保留当前页面,当页面离开视线后,就会被消除,释放其资源;而在页面需要显示时,生成新的页面(就像 ListView 的实现一样)。这么实现的好处就是当拥有大量的页面时,不必在内存中占用大量的内存。
解决办法:使用FragmentStatePagerAdapte
让MyFragmentPagerAdapter继承自FragmentStatePagerAdapter,并另外重写其中的两个方法就可以实现动态加载和销毁页面了
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
super.destroyItem(container, position, object);
}
@Override
public Object instantiateItem(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
return super.instantiateItem(arg0, arg1);
}
package com.example.android_viewpager;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.view.ViewGroup;
public class MyFragmentPagerAdapter2 extends FragmentStatePagerAdapter{
private List<Fragment>fragList;
private List<String>titleList;
public MyFragmentPagerAdapter2(FragmentManager fm,List<Fragment> fragList,List<String>titleList) {
super(fm);
// TODO Auto-generated constructor stub
this.fragList=fragList;
this.titleList=titleList;
}
@Override
public Fragment getItem(int arg0) {
// TODO Auto-generated method stub
return fragList.get(arg0);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fragList.size();
}
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titleList.get(position);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
super.destroyItem(container, position, object);
}
@Override
public Object instantiateItem(ViewGroup arg0, int arg1) {
// TODO Auto-generated method stub
return super.instantiateItem(arg0, arg1);
}
}
总结:
Fragment的生命周期比较全,它的创建销毁等比View好控制
所有在做交互界面时使用Fragment,如果界面只是为了展示可以使用ViewPagerAdapter