关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » 安卓开发 »Android ViewPager 的使用总结

    Android ViewPager 的使用总结

    2015-10-24 00:00:00 出处:亓斌
    分享

    在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,这些页面共享同一个窗口的资源,同使用多个窗口来实现这个功能来得更加流畅!!

    主要产生的类文件有activity,n个view,adapter,自定义的ViewPager,n+1个布局文件

    demo所用到文件

    Android ViewPager的使用

    Android ViewPager的使用

    步骤:

    创建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

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    SQL汉字转换为拼音的函数

    windows 7系统无法运行Photoshop CS3的解决方法

    巧用MySQL加密函数对Web网站敏感数据进行保护

    MySQL基础知识简介

    Windows7和WinXP下如何实现不输密码自动登录系统的设置方法介绍

    windows 7系统ip地址冲突怎么办?windows 7系统IP地址冲突问题的

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。