Android ViewPager 的使用总结
程序员文章站
2024-03-05 12:42:18
在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,这些页面共享同一个窗口的资源,同使用多个窗口来实现这个功能来得更加流...
在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,这些页面共享同一个窗口的资源,同使用多个窗口来实现这个功能来得更加流畅!!
主要产生的类文件有activity,n个view,adapter,自定义的viewpager,n+1个布局文件
demo所用到文件
步骤:
创建activity
package com.example.myviewpager; import java.util.arraylist; import java.util.list; import android.app.activity; import android.content.context; import android.graphics.color; import android.os.bundle; import android.support.v4.view.viewpager; import android.view.view; import android.view.view.onclicklistener; import android.widget.textview; /** * 主窗口 * @author cgx * */ public class mainactivity extends activity implements onclicklistener { private context mcontext; private myviewpager mpager;// 页面内容 private myviewpageradapter pageradapter = null; private textview t1, t2, t3;// 页卡头标 private list<view> pagelist = new arraylist<view>(); private view1 mview1; private view2 mview2; private view3 mview3; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mcontext = this; initviews(); initevents(); initviewpager(); } private void initviews() { // todo auto-generated method stub t1 = (textview) findviewbyid(r.id.text1); t2 = (textview) findviewbyid(r.id.text2); t3 = (textview) findviewbyid(r.id.text3); mpager = (myviewpager) findviewbyid(r.id.vpager); // 设置viewpager不允许滑动 //mpager.setcanscroll(false); //一开始进入窗口的时候,默认第一个便签被选中 t1.setbackgroundcolor(color.parsecolor("#ffff00")); t2.setbackgroundcolor(color.parsecolor("#ffffff")); t3.setbackgroundcolor(color.parsecolor("#ffffff")); } private void initevents() { // todo auto-generated method stub t1.setonclicklistener(this); t2.setonclicklistener(this); t3.setonclicklistener(this); } private void initviewpager() { // todo auto-generated method stub pagelist.clear(); if (mview1 == null) { mview1 = new view1(mcontext); } if (mview2 == null) { mview2 = new view2(mcontext); } if (mview3 == null) { mview3 = new view3(mcontext); } pagelist.add(mview1.getview()); pagelist.add(mview2.getview()); pagelist.add(mview3.getview()); pageradapter = new myviewpageradapter(pagelist); // 缓存页面,如果想全部都缓存的话,参数等于页卡数减一,系统默认参数为1,保存两个 mpager.setoffscreenpagelimit(2); mpager.setadapter(pageradapter); // 设置page改变监听器 mpager.setonpagechangelistener(onpagechangelistener); } /** * simpleonpagechangelistener.该监听是当我们的viewpager页面切换的时候会触发 在里面我们会去改变 tab的聚焦情况 * 。 因为实现上viewpager与actionbar是独立的,需要我们手动同步 。 */ viewpager.simpleonpagechangelistener onpagechangelistener = new viewpager.simpleonpagechangelistener() { @override public void onpageselected(int position) { /** * setselectednavigationitem 方法用于设置actionbar的聚焦tab . * 在接下来我们判断了slidingmenu的手*模式, 如果viewpager已经滑到了最左边,则我们把手势设置成全屏的, * 这样更往左滑动的时候,就会打开menu . */ inittab(position); } // 初始化便签颜色 private void inittab(int position) { // todo auto-generated method stub if (position == 0) { t1.setbackgroundcolor(color.parsecolor("#ffff00")); t2.setbackgroundcolor(color.parsecolor("#ffffff")); t3.setbackgroundcolor(color.parsecolor("#ffffff")); } else if (position == 1) { t1.setbackgroundcolor(color.parsecolor("#ffffff")); t2.setbackgroundcolor(color.parsecolor("#ffff00")); t3.setbackgroundcolor(color.parsecolor("#ffffff")); } else { t1.setbackgroundcolor(color.parsecolor("#ffffff")); t2.setbackgroundcolor(color.parsecolor("#ffffff")); t3.setbackgroundcolor(color.parsecolor("#ffff00")); } } }; @override public void onclick(view v) { // todo auto-generated method stub switch (v.getid()) { case r.id.text1:// 点击第一个便签 mpager.setcurrentitem(0, false); break; case r.id.text2:// 点击第二个便签 mpager.setcurrentitem(1, false); break; case r.id.text3:// 点击第三个便签 mpager.setcurrentitem(2, false); break; default: break; } } }
自定义myviewpager
package com.example.myviewpager; import android.content.context; import android.support.v4.view.viewpager; import android.util.attributeset; import android.view.motionevent; /** * 自定义滑动翻页可控,可通过设置iscanscroll参数来控制是否允许滑动切换页面 */ public class myviewpager extends viewpager { /** 是否允许滑动翻页 ,默认可滑动*/ private boolean iscanscroll = true; public myviewpager(context context, attributeset attrs) { super(context, attrs); } public myviewpager(context context) { super(context); } public boolean iscanscroll() { return iscanscroll; } /** 设置是否可以滑动翻页 */ public void setcanscroll(boolean iscanscroll) { this.iscanscroll = iscanscroll; } @override public void scrollto(int x, int y) { super.scrollto(x, y); } // 设置禁止滑动的关键 @override public boolean ontouchevent(motionevent arg0) { if (!iscanscroll) return true; return super.ontouchevent(arg0); } @override public boolean onintercepttouchevent(motionevent arg0) { return super.onintercepttouchevent(arg0); } @override public void setcurrentitem(int item, boolean smoothscroll) { super.setcurrentitem(item, smoothscroll); } @override public void setcurrentitem(int item) { super.setcurrentitem(item); } }
适配器:
package com.example.myviewpager; import java.util.list; import android.support.v4.view.pageradapter; import android.view.view; import android.view.viewgroup; /** * viewpager适配器 * */ public class myviewpageradapter extends pageradapter{ private list<view> mlistviews; public myviewpageradapter(list<view> mlistviews) { this.mlistviews = mlistviews;//构造方法,参数是我们的页卡,这样比较方便 } @override public void destroyitem(viewgroup container, int position, object object) { container.removeview(mlistviews.get(position));//删除页卡 } @override public object instantiateitem(viewgroup container, int position) { //这个方法用来实例化页卡 container.addview(mlistviews.get(position), 0);//添加页卡 return mlistviews.get(position); } @override public int getcount() { return mlistviews.size();//返回页卡的数目 } @override public boolean isviewfromobject(view arg0, object arg1) { return arg0==arg1;//官方提示这样写 } }
第一个view
package com.example.myviewpager; import android.content.context; import android.view.layoutinflater; import android.view.view; /** * 第一个 * @author cgx * */ public class view1 { private context mcontext; private view rootview; public view1(context mcontext) { // todo auto-generated constructor stub this.mcontext=mcontext; //加载布局 rootview = layoutinflater.from(mcontext).inflate( r.layout.view1_layout, null); } public view getview(){ return rootview; } }
activity布局文件
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <linearlayout android:id="@+id/linearlayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#ffffff" > <textview android:id="@+id/text1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="页卡1" android:textcolor="#000000" android:textsize="20sp" /> <textview android:id="@+id/text2" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="页卡2" android:textcolor="#000000" android:textsize="20sp" /> <textview android:id="@+id/text3" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1.0" android:gravity="center" android:text="页卡3" android:textcolor="#000000" android:textsize="20sp" /> </linearlayout> <com.example.myviewpager.myviewpager android:id="@+id/vpager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_weight="1.0" android:background="#000000" android:flipinterval="30" /> </linearlayout>
view1的布局
<?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:background="#123456" > </linearlayout>
由于用于演示,所以view的布局只是用不同的背景色来区分,开发中具体要展示的布局可以直接在view的布局文件里面改。demo中的view都是参考第一个来写的,类似
总结。
实际开发中,虽然官方提供了很多api,真正等到要自己用的时候,还是自己在依照习惯再包装一层,成为自己的工具,这样以后就可以直接用了,上面的例子是我在实习期间总结的,鄙陋之处敬请原谅,也欢迎大家指出,一起学习(^_^)
代码链接:http://pan.baidu.com/s/1pjaf6gz
以上就是对android viewpager 的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!