关闭 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

    上一篇返回首页 下一篇

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

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

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

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