Android App中使用ViewPager+Fragment实现滑动切换效果
在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用viewpager,代码就会短很多,但是使用viewpager也有弊端:需要导入android-support-v4.jar、细节无法控制。不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包。那我们就也采用viewpager来做滑动吧。另外一个概念就是fragment和fragmentactivity,fragment是一个特殊的类,有着和activity一致的生命周期和view一致的界面,也就是fragment就等于具有生命周期的view,但是,要注意的是:fragment并不是view,它和view没有继承关系。使用fragment的好处是:fragment可以重用,而且每个fragment可以在内部处理自己的业务就像activity一样,这样模块间耦合较低,比把所有的业务都写在一个activity内部逻辑要清晰很多。还有就是,由于每个模块的业务都在fragment内部来实现,这样activity只要管理好几个fragment就行了,不需要做和业务相关的事情,最后,fragment可以用来做不同分辨率机型的适配。fragment在sdk(android 3.0及更高)和android-support-v4里面都有,但是由于兼容性的问题,我们只能使用android-support-v4里面的fragment,除非你想你的apk只跑在3.0以后的android手机上,fragmentactivity的情况和fragment类似。关于fragment和fragmentactivity,其实有一些基本的用法需要了解一下,但是考虑到fragment不是本文的重点,所以这里就不介绍了,另外,本文只用fragment做了一个简单的界面,大家应该一看就懂,好了,言归正传。
viewpager + fragment 经常用到 代码是从 actionbarsherlock 中提取出来的,这个效果都知道是 滑动来切换的。直接上代码了
在这里简单说明一下 fragmentstatepageradapter 和 fragmentpageradapter
2个adapter:
第一种 fragment状态adapter - 在当前只会存在 前1个fragment 当前 fragment 和 下1个 fragment 其他销毁 ,适合加载多数据;
第二种 fragmentpageradapter - 全部存在,所以不太适合加载 大量的数据 如图片什么的,很容易内存溢出。
工程结构:
1.activity adapter 在一起 (static类型的 fragment)
public class viewpagefragment extends fragmentactivity { //这个是有多少个 fragment页面 static final int num_items = 5; private myadapter madapter; private viewpager mpager; private int nowpage; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.pagers_fragment_main); madapter = new myadapter(getsupportfragmentmanager() ); mpager = (viewpager)findviewbyid(r.id.mypagers_pager); mpager.setadapter(madapter); } /** * 有状态的 ,只会有前3个存在 其他销毁, 前1个, 中间, 下一个 */ public static class myadapter extends fragmentstatepageradapter { public myadapter(fragmentmanager fm) { super(fm); } @override public int getcount() { return num_items; } //得到每个item @override public fragment getitem(int position) { return arrayfragment.newinstance(position); } // 初始化每个页卡选项 @override public object instantiateitem(viewgroup arg0, int arg1) { // todo auto-generated method stub return super.instantiateitem(arg0, arg1); } @override public void destroyitem(viewgroup container, int position, object object) { system.out.println( "position destory" + position); super.destroyitem(container, position, object); } } /** * 无状态的 会全部加载着, 这个适合少量的 特别多的图片啊啥的 还是用 fragmentstatepageradapter * @author lilei */ // public static class myadapter extends fragmentpageradapter { // public myadapter(fragmentmanager fm ) { // super(fm); // // } // // @override // public int getcount() { // return num_items; // } // // @override // public fragment getitem(int position) { // // 返回相应的 fragment // return arrayfragment.newinstance(position); // } // // @override // public void destroyitem(viewgroup container, int position, object object) { // system.out.println( "position destory" + position); // super.destroyitem(container, position, object); // } // } /** * 所有的 每个fragment */ public static class arrayfragment extends fragment { int mnum; static arrayfragment newinstance(int num) { arrayfragment array= new arrayfragment(); bundle args = new bundle(); args.putint("num", num); array.setarguments(args); return array; } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mnum = getarguments() != null ? getarguments().getint("num") : 1; system.out.println("mnum fragment create ="+ mnum); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { system.out.println("oncreateview = "); //在这里加载每个 fragment的显示的 view view v = null; if(mnum == 0){ v = inflater.inflate(r.layout.pagers_fragment1, container, false); ((textview)v.findviewbyid(r.id.textview1)).settext(mnum+ "= mnum"); }else if(mnum == 1){ v = inflater.inflate(r.layout.pagers_fragment1, container, false); ((textview)v.findviewbyid(r.id.textview1)).settext(mnum+ "= mnum"); }else if(mnum == 2){ v = inflater.inflate(r.layout.pagers_fragment1, container, false); ((textview)v.findviewbyid(r.id.textview1)).settext(mnum+ "= mnum"); }else{ v = inflater.inflate(r.layout.pagers_fragment1, container, false); ((textview)v.findviewbyid(r.id.textview1)).settext(mnum+ "= mnum"); } return v; } @override public void onactivitycreated(bundle savedinstancestate) { system.out.println("onactivitycreated = "); super.onactivitycreated(savedinstancestate); } @override public void ondestroyview(){ system.out.println(mnum + "mnumdestory"); super.ondestroyview(); } @override public void ondestroy(){ super.ondestroy(); } } }
2. 和 1也没什么太大区别( 个中用处 看个人了 )
public class viewpagefragmentcs extends fragmentactivity { //这个是有多少个 fragment页面 private myadapter madapter; private viewpager mpager; private list<entity> list = new arraylist<viewpagefragmentcs.entity>();; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.pagers_fragment_main); for (int i = 0; i < 7 ; i++) { entity ee = new entity(); ee.name = "ll"+ i; ee.age = ""+ i; list.add(ee); } madapter = new myadapter(getsupportfragmentmanager(),list); mpager = (viewpager)findviewbyid(r.id.mypagers_pager); mpager.setadapter(madapter); } private class entity{ public string name; public string age; } // 在这里你可以传 list<fragment> 也可以传递 list<object>数据 public class myadapter extends fragmentstatepageradapter { list<entity> list_ee; public myadapter(fragmentmanager fm, list<entity> ee) { super(fm); this.list_ee = ee ; } @override public int getcount() { return list_ee.size(); } // 初始化每个页卡选项 @override public object instantiateitem(viewgroup arg0, int position) { arrayfragment ff = (arrayfragment)super.instantiateitem(arg0, position); ff.setthings(list_ee.get(position),position); return ff; } @override public void destroyitem(viewgroup container, int position, object object) { system.out.println( "position destory" + position); super.destroyitem(container, position, object); } @override public fragment getitem(int arg0) { // todo auto-generated method stub return new arrayfragment(); } } /** * 所有的 每个fragment */ public class arrayfragment extends fragment { private entity ee; private int position; public void setthings(entity ee,int position){ this.ee =ee ; this.position = position; } @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { system.out.println("oncreateview = "); //在这里加载每个 fragment的显示的 view view v = inflater.inflate(r.layout.pagers_fragment1, container, false); ((textview)v.findviewbyid(r.id.textview1)).settext(ee.name+ "= ee.name -=age"+ ee.age); return v; } @override public void onactivitycreated(bundle savedinstancestate) { system.out.println("onactivitycreated = "); super.onactivitycreated(savedinstancestate); } @override public void ondestroyview(){ system.out.println("ondestroyview = "+ position); super.ondestroyview(); } @override public void ondestroy(){ system.out.println("ondestroy = "+ position); super.ondestroy(); } } }
直接复制过去就可以看效果了 别忘记 v4包,xml 布局文件 自己随便整个吧。
滑动到第3个页面的时候可以看到第1个页面销毁第4个生成,当前存在2、3、4:
推荐阅读
-
Android应用中使用ViewPager实现类似QQ的界面切换效果
-
Android应用中利用ViewPager实现多页面滑动切换效果示例
-
在Android app中实现九(n)宫格图片连续滑动效果
-
Android开发中实现应用的前后台切换效果
-
在Android app中实现九(n)宫格图片连续滑动效果
-
Android开发中实现应用的前后台切换效果
-
Android中Toolbar随着ScrollView滑动透明度渐变效果实现
-
android 中win10 使用uwp控件实现进度条Marquez效果
-
Android如何使用ViewPager2实现页面滑动切换效果
-
Android中Toolbar随着ScrollView滑动透明度渐变效果实现