<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); } }
(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是动态加载和销毁页面的:
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