首页 > 代码库 > Android学习之——ViewPager及应用引导页的开发

Android学习之——ViewPager及应用引导页的开发

背景知识

     当我们第一次安装Android应用时,有的应用会有引导页,要么是用于介绍应用的新功能,要么就是关于应用的介绍,有的甚至是推广广告等。

    

       

   

    

     那么这个应用引导页是怎样实现的呢?这就得有请我们今天的主角登场了——ViewPager。

 


ViewPager介绍

   

 

    ViewPager继承自ViewGroup类,属于android.support.v4.view包(这个包是Google提供给我们开发兼容低版本Android的包,主要功能是提供各种各样的类来向后处理View的兼容性)。

  ViewPager,允许用户左右滑动来查看View。和ListView一样,不能直接将View对象呈现在ViewPager上。需实现PagerAdapter来将View适配成Page以显示到ViewPager上。ViewPager经常和Fragment同时使用,这是一种使用Page和管理Page生命周期很方便的方式。


 

如何使用ViewPager

  1.在布局文件中添加ViewPager(注意要写android.support.v4.view.ViewPager)

1  <android.support.v4.view.ViewPager2         android:id="@+id/viewpager"3         android:layout_width="fill_parent"4         android:layout_height="fill_parent" >5     </android.support.v4.view.ViewPager>

  2.加载要显示的Page

 1 private List<View> views; 2  3 LayoutInflater inflater = LayoutInflater.from(this); 4 view1 = inflater.inflate(R.layout.one, null); 5 view2 = inflater.inflate(R.layout.two, null); 6 view3 = inflater.inflate(R.layout.three, null); 7 views = new ArrayList<View>(); 8 views.add(view1); 9 views.add(view2);10 views.add(view3);

 3.实例化ViewPager并设置它的Adapter。

 方法1:直接在Activity中重写PagerAdapter

 1     PagerAdapter pagerAdapter = new PagerAdapter() {   2        3                 @Override   4                 public boolean isViewFromObject(View arg0, Object arg1) {   5        6                     return arg0 == arg1;   7                 }   8        9                 @Override  10                 public int getCount() {  11       12                     return views.size();  13                 }  14       15                 @Override  16                 public void destroyItem(ViewGroup container, int position,  17                         Object object) {  18                     container.removeView(views.get(position));  19       20                 }  21       22                 @Override  23                 public int getItemPosition(Object object) {  24       25                     return super.getItemPosition(object);  26                 }  27       28                 @Override  29                 public CharSequence getPageTitle(int position) {  30       31                     return titleList.get(position);  32                 }  33       34                 @Override  35                 public Object instantiateItem(ViewGroup container, int position) {  36                     container.addView(views.get(position));  37                     return viewList.get(position);  38                 }  39       40             };  41             viewPager.setAdapter(pagerAdapter);  

方法2.创建自己的PagerAdapter类继承自PagerAdapter类。

 1 public class ViewPagerAdapter extends PagerAdapter { 2  3     private List<View> views; 4     private Context context; 5     6     /** 7      * 构造方法 8      * @param views   9      * @param context10      */11     public ViewPagerAdapter(List<View> views, Context context) {12 13         this.views = views;14         this.context = context;15     }16     /**17      * 销毁View18      */19     @Override20     public void destroyItem(View container, int position, Object object) {21 22         ((ViewPager) container).removeView(views.get(position));23     }24     /**25      * 实例化View26      */27     @Override28     public Object instantiateItem(View container, int position) {29 30         ((ViewPager) container).addView(views.get(position));31 32         return views.get(position);33 34     }35    36     @Override37     public int getCount() {38         return views.size();39     }40    41     @Override42     public boolean isViewFromObject(View arg0, Object arg1) {43         return (arg0 == arg1);44     }45 46 }

实现一个PagerAdapter,要实现以下几种方法:

instantiateItem(ViewGroup, int)         //实例化destroyItem(ViewGroup, int, Object)   //销毁getCount()                                     //获取总数 isViewFromObject(View, Object)         //用于确认instantiateItem是否返回了和关键对象有关的Page视图

 效果展示:

             

 


 

使用ViewPager开发应用引导页

 学会了使用ViewPager之后,开发应用引导页就没有什么难点了。关键就是:用户只有在第一次安装应用进入应用后才会有引导页,之后打开就直接进入主界面了。

所以这里要有一个判断:用户是不是第一次进入应用。将这个值存储在手机中,在这里使用SharedPreferences存储。

  

 1          //用SharedPreferences来存储用户是否是安装后第一次使用的值 2         SharedPreferences perPreferences = getSharedPreferences("JohnTsai", MODE_PRIVATE); 3         isFirstUse = perPreferences.getBoolean("isFirstUse", true); 4         if (!isFirstUse) { 5             //进入主界面 6                        ... 7         }else{ 8             //反之则跳转到引导界面 9             ...10             Editor editor = perPreferences.edit();11             editor.putBoolean("isFirstUse", false);12             editor.commit();13         }

 

   注意到每个引导页页面下方都有1个小黑点,用于指示当前所在页。

 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" > 5  6     <android.support.v4.view.ViewPager 7         android:id="@+id/viewpager" 8         android:layout_width="fill_parent" 9         android:layout_height="fill_parent"10         android:background="#00000000" >11     </android.support.v4.view.ViewPager>12 13     <LinearLayout14         android:id="@+id/linearLayout"15         android:layout_width="fill_parent"16         android:layout_height="wrap_content"17         android:layout_alignParentBottom="true"18         android:gravity="center_horizontal"19         android:orientation="horizontal" >20   21         <!-- 图片下方的点 -->22         <ImageView23             android:id="@+id/imageView1"24             android:layout_width="wrap_content"25             android:layout_height="wrap_content"26             android:src="@drawable/point_selected" />27 28         <ImageView29             android:id="@+id/imageView2"30             android:layout_width="wrap_content"31             android:layout_height="wrap_content"32             android:src="@drawable/point_unselected" />33 34         <ImageView35             android:id="@+id/imageView3"36             android:layout_width="wrap_content"37             android:layout_height="wrap_content"38             android:src="@drawable/point_unselected" />39     </LinearLayout>40 41 </RelativeLayout>

    那怎样实现滑动,图片下方的点也随着改变呢?这就要实现OnPageChangeListener接口了,重写它的方法。

   

 1       //引导界面下面的小点,用于显示当前View是第几个 2     private ImageView[] dots; 3     private int[] ids = { R.id.imageView1, R.id.imageView2,R.id.imageView3 }; 4         dots = new ImageView[views.size()]; 5         for (int i = 0; i < views.size(); i++) { 6             dots[i] = (ImageView) findViewById(ids[i]); 7         } 8             @Override 9     public void onPageScrollStateChanged(int arg0) {10 11     }12 13     @Override14     public void onPageScrolled(int arg0, float arg1, int arg2) {15 16     }17 18     @Override19     public void onPageSelected(int arg0) {20         for (int i = 0; i < ids.length; i++) {21             //若当前的界面是用户选中的界面,则点设置为选中状态,反之,则为没选中状态22             if (arg0 == i) {23                 dots[i].setImageResource(R.drawable.point_selected);24             } else {25                 dots[i].setImageResource(R.drawable.point_unselected);26             }27         }28     }

 

Android学习之——ViewPager及应用引导页的开发