这是谷歌官方给我们提供的一个兼容低版本安卓设备的软件包,里面包囊了只有在安卓3.0以上可以使用的api。而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。看一下api的图片,
ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。分三个步骤来使用它:
1.在住布局文件里加入
1. <android.support.v4.view.ViewPager 这个组件,注意这个组件是用来显示左右滑动的界面的,如果不加载xml布局文件,他是不会显示内容的。
2. android:id="@+id/viewpager"
3. android:layout_width="wrap_content"
4. android:layout_height="wrap_content"
5. android:layout_gravity="center" >2.加载要显示的页卡,
1. LayoutInflater lf = getLayoutInflater().from(this);
2. null);
3. null);
4. null);
5.
6. new ArrayList<View>();// 将要分页显示的View装入数组中
7. viewList.add(view1);
8. viewList.add(view2);
9. viewList.add(view3);
3.在Activity里实例化ViewPager组件,并设置它的Adapter(就是PagerAdapter,方法与ListView一样的),在这里一般需要重写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 viewList.size();
13. }
14.
15. @Override
16. public void destroyItem(ViewGroup container, int position,
17. Object object) {
18. container.removeView(viewList.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(viewList.get(position));
37. weibo_button=(Button) findViewById(.button1);
38. new OnClickListener() {
39.
40. public void onClick(View v) {
41. new Intent(ViewPagerDemo.this,WeiBoActivity.class);
42. startActivity(intent);
43. }
44. });
45. return viewList.get(position);
46. }
47.
48. };
49. viewPager.setAdapter(pagerAdapter);这是重写PagerAdapter的一个方法,我们还可以这样做:
1. public class MyViewPagerAdapter extends PagerAdapter{
2. private List<View> mListViews;
3.
4. public MyViewPagerAdapter(List<View> mListViews) {
5. this.mListViews = mListViews;//构造方法,参数是我们的页卡,这样比较方便。
6. }
7.
8. @Override
9. public void destroyItem(ViewGroup container, int position, Object object) {
10. //删除页卡
11. }
12.
13.
14. @Override
15. public Object instantiateItem(ViewGroup container, int position) { //这个方法用来实例化页卡
16. 0);//添加页卡
17. return mListViews.get(position);
18. }
19.
20. @Override
21. public int getCount() {
22. return mListViews.size();//返回页卡的数量
23. }
24.
25. @Override
26. public boolean isViewFromObject(View arg0, Object arg1) {
27. return arg0==arg1;//官方提示这样写
28. }
29. }大同小异,有一定很重要,就是我们需要重写哪些方法。从上面的图片可以看到,ViewPager的适配器是PagerAdapter,它是基类提供适配器来填充页面ViewPager内部,你很可能想要使用一个更具体的实现,如FragmentPagerAdapter或FragmentStatePagerAdapter。在这里需要说明一下,其实ViewPager应该和Fragment一起使用,至少谷歌官方是这么想的,但是在3.0之下,我们没有必要这么做。下面要注意,当你实现一个PagerAdapter,你必须至少覆盖以下方法:
instantiateItem(ViewGroup, int)destroyItem(ViewGroup, int, Object)getCount()isViewFromObject(View, Object)
从上面的例子中可以看到,我们最少也是实现了上面四个方法,当然如果你想让程序更健壮或是功能更全面,你可以重写其他的方法。下面看一下第一个完整的示例代码:
主页面Activity:
1. package com.example.viewpagerdemo;
2.
3. import java.util.ArrayList;
4. import java.util.List;
5. import android.os.Bundle;
6. import .Activity;
7. import android.content.Context;
8. import android.content.Intent;
9. import android.support.v4.view.PagerAdapter;
10. import android.support.v4.view.PagerTabStrip;
11. import android.support.v4.view.PagerTitleStrip;
12. import android.support.v4.view.ViewPager;
13. import android.util.AttributeSet;
14. import android.view.LayoutInflater;
15. import android.view.Menu;
16. import android.view.View;
17. import android.view.View.OnClickListener;
18. import android.view.ViewGroup;
19. import android.widget.Button;
20.
21. public class ViewPagerDemo extends Activity {
22.
23. private View view1, view2, view3;//需要滑动的页卡
24. private ViewPager viewPager;//viewpager
25. private PagerTitleStrip pagerTitleStrip;//viewpager的标题
26. private PagerTabStrip pagerTabStrip;//一个viewpager的指示器,效果就是一个横的粗的下划线
27. private List<View> viewList;//把需要滑动的页卡添加到这个list中
28. private List<String> titleList;//viewpager的标题
29. private Button weibo_button;//button对象,一会用来进入第二个Viewpager的示例
30. private Intent intent;
31. @Override
32. public void onCreate(Bundle savedInstanceState) {
33. super.onCreate(savedInstanceState);
34. setContentView(R.layout.activity_view_pager_demo);
35. initView();
36. }
37. /*在这里需要说明一下,在上面的图片中我们看到了,PagerTabStrip,PagerTitleStrip,他们其实是viewpager的一个指示器,前者效果就是一个横的粗的下划线,后者用来显示各个页卡的标题,当然而这也可以共存。在使用他们的时候需要注意,看下面的布局文件,要在android.support.v4.view.ViewPager里面添加
38. android.support.v4.view.PagerTabStrip以及android.support.v4.view.PagerTitleStrip。
39.
40. private void initView() {
41. viewPager = (ViewPager) findViewById(.viewpager);
42. //pagerTitleStrip = (PagerTitleStrip) findViewById(.pagertitle);
43. pagerTabStrip=(PagerTabStrip) findViewById(.pagertab);
44. pagerTabStrip.setTabIndicatorColor(getResources().getColor(R.color.gold));
45. pagerTabStrip.setDrawFullUnderline(false);
46. pagerTabStrip.setBackgroundColor(getResources().getColor(R.color.azure));
47. pagerTabStrip.setTextSpacing(50);
48. /*
49. weibo_button=(Button) findViewById(.button1);
50. weibo_button.setOnClickListener(new OnClickListener() {
51.
52. public void onClick(View v) {
53. intent=new Intent(ViewPagerDemo.this,WeiBoActivity.class);
54. startActivity(intent);
55. }
56. });
57. */
58.
59. view1 = findViewById(R.layout.layout1);
60. view2 = findViewById(R.layout.layout2);
61. view3 = findViewById(R.layout.layout3);
62.
63. this);
64. null);
65. null);
66. null);
67.
68. new ArrayList<View>();// 将要分页显示的View装入数组中
69. viewList.add(view1);
70. viewList.add(view2);
71. viewList.add(view3);
72.
73. new ArrayList<String>();// 每个页面的Title数据
74. "wp");
75. "jy");
76. "jh");
77.
78. new PagerAdapter() {
79.
80. @Override
81. public boolean isViewFromObject(View arg0, Object arg1) {
82.
83. return arg0 == arg1;
84. }
85.
86. @Override
87. public int getCount() {
88.
89. return viewList.size();
90. }
91.
92. @Override
93. public void destroyItem(ViewGroup container, int position,
94. Object object) {
95. container.removeView(viewList.get(position));
96.
97. }
98.
99. @Override
100. public int getItemPosition(Object object) {
101.
102. return super.getItemPosition(object);
103. }
104.
105. @Override
106. public CharSequence getPageTitle(int position) {
107.
108. return titleList.get(position);//直接用适配器来完成标题的显示,所以从上面可以看到,我们没有使用PagerTitleStrip。当然你可以使用。
109.
110. }
111.
112. @Override
113. public Object instantiateItem(ViewGroup container, int position) {
114. container.addView(viewList.get(position));
115. //这个需要注意,我们是在重写adapter里面实例化button组件的,如果你在onCreate()方法里这样做会报错的。
116. new OnClickListener() {
117.
118. public void onClick(View v) {
119. new Intent(ViewPagerDemo.this,WeiBoActivity.class);
120. startActivity(intent);
121. }
122. });
123. return viewList.get(position);
124. }
125.
126. };
127. viewPager.setAdapter(pagerAdapter);
128. }
129.
130. @Override
131. public boolean onCreateOptionsMenu(Menu menu) {
132. getMenuInflater().inflate(R.menu.activity_view_pager_demo, menu);
133. return true;
134. }
135.
136. }它的布局文件:
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http:///apk/res/android"
3. "fill_parent"
4. "fill_parent"
5. "vertical" >
6.
7. <android.support.v4.view.ViewPager
8. "@+id/viewpager"
9. "wrap_content"
10. "wrap_content"
11. "center" >
12.
13. <android.support.v4.view.PagerTabStrip
14. "@+id/pagertab"
15. "wrap_content"
16. "wrap_content"
17. "top"/>
18.
19. </android.support.v4.view.ViewPager>
20.
21. </LinearLayout>
22. <!--注意事项:
23. 1.这里ViewPager和 PagerTabStrip都要把包名写全了,不然会ClassNotFount
24. 2.API中说:在布局xml把PagerTabStrip当做ViewPager的一个子标签来用,不能拿出来,不然还是会报错
25. 3.在PagerTabStrip标签中可以用属性android:layout_gravity=TOP|BOTTOM来指定title的位置
26. 4.如果要显示出PagerTabStrip某一页的title,需要在ViewPager的adapter中实现getPageTitle(int)-->可以左右滑动页卡,但是仔细看一下,标题的效果不好,不能一次显示一个,而且标题还滑动。其实在api里面提供了一个pagerTabStrip.setTextSpacing()来设置标题的距离,但是我在这里设置了,没有效果不知道为什么,明白的朋友希望能够赐教一下。
所以就有人使用下面这样的方法来仿微博的效果,
,
这个标题就固定了,而且可以左右滑动,也有下面的横线,来指示页卡。方法和上面的差不多,区别在于这个横线需要我们自己来做,其实就是一个图片。这个例子是网上的一篇文章,看代码:
主Activity:
1. package com.example.viewpagerdemo;
2.
3. import java.util.ArrayList;
4. import java.util.List;
5. import .Activity;
6. import android.graphics.BitmapFactory;
7. import android.graphics.Matrix;
8. import android.os.Bundle;
9. import android.support.v4.view.PagerAdapter;
10. import android.support.v4.view.ViewPager;
11. import android.support.v4.view.ViewPager.OnPageChangeListener;
12. import android.util.DisplayMetrics;
13. import android.view.LayoutInflater;
14. import android.view.View;
15. import android.view.View.OnClickListener;
16. import android.view.animation.Animation;
17. import android.view.animation.TranslateAnimation;
18. import android.view.ViewGroup;
19. import android.widget.ImageView;
20. import android.widget.TextView;
21. import android.widget.Toast;
22.
23. public class WeiBoActivity extends Activity {
24.
25. private ViewPager viewPager;//页卡内容
26. private ImageView imageView;// 动画图片
27. private TextView textView1,textView2,textView3;
28. private List<View> views;// Tab页面列表
29. private int offset = 0;// 动画图片偏移量
30. private int currIndex = 0;// 当前页卡编号
31. private int bmpW;// 动画图片宽度
32. private View view1,view2,view3;//各个页卡
33. @Override
34. protected void onCreate(Bundle savedInstanceState) {
35. super.onCreate(savedInstanceState);
36. setContentView(R.layout.weibo);
37. InitImageView();
38. InitTextView();
39. InitViewPager();
40. }
41.
42. private void InitViewPager() {
43. viewPager=(ViewPager) findViewById(.vPager);
44. new ArrayList<View>();
45. LayoutInflater inflater=getLayoutInflater();
46. null);
47. null);
48. null);
49. views.add(view1);
50. views.add(view2);
51. views.add(view3);
52. new MyViewPagerAdapter(views));
53. 0);
54. new MyOnPageChangeListener());
55. }
56. /**
57. * 初始化头标
58. */
59.
60. private void InitTextView() {
61. textView1 = (TextView) findViewById(.text1);
62. textView2 = (TextView) findViewById(.text2);
63. textView3 = (TextView) findViewById(.text3);
64.
65. new MyOnClickListener(0));
66. new MyOnClickListener(1));
67. new MyOnClickListener(2));
68. }
69.
70. /**
71. 2 * 初始化动画,这个就是页卡滑动时,下面的横线也滑动的效果,在这里需要计算一些数据
72. 3 */
73.
74. private void InitImageView() {
75. imageView= (ImageView) findViewById(.cursor);
76. // 获取图片宽度
77. new DisplayMetrics();
78. getWindowManager().getDefaultDisplay().getMetrics(dm);
79. int screenW = dm.widthPixels;// 获取分辨率宽度
80. 3 - bmpW) / 2;// 计算偏移量
81. new Matrix();
82. 0);
83. // 设置动画初始位置
84. }
85. <img src="//img-my.csdn.net/uploads/201211/10/1352554452_1685.jpg" alt="">
86. /**
87. *
88. * 头标点击监听 3 */
89. private class MyOnClickListener implements OnClickListener{
90. private int index=0;
91. public MyOnClickListener(int i){
92. index=i;
93. }
94. public void onClick(View v) {
95. viewPager.setCurrentItem(index);
96. }
97.
98. }
99.
100. public class MyViewPagerAdapter extends PagerAdapter{
101. private List<View> mListViews;
102.
103. public MyViewPagerAdapter(List<View> mListViews) {
104. this.mListViews = mListViews;
105. }
106.
107. @Override
108. public void destroyItem(ViewGroup container, int position, Object object) {
109. container.removeView(mListViews.get(position));
110. }
111.
112.
113. @Override
114. public Object instantiateItem(ViewGroup container, int position) {
115. 0);
116. return mListViews.get(position);
117. }
118.
119. @Override
120. public int getCount() {
121. return mListViews.size();
122. }
123.
124. @Override
125. public boolean isViewFromObject(View arg0, Object arg1) {
126. return arg0==arg1;
127. }
128. }
129.
130. public class MyOnPageChangeListener implements OnPageChangeListener{
131.
132. int one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量
133. int two = one * 2;// 页卡1 -> 页卡3 偏移量
134. public void onPageScrollStateChanged(int arg0) {
135.
136.
137. }
138.
139. public void onPageScrolled(int arg0, float arg1, int arg2) {
140.
141.
142. }
143.
144. public void onPageSelected(int arg0) {
145. /*两种方法,这个是一种,下面还有一种,显然这个比较麻烦
146. Animation animation = null;
147. switch (arg0) {
148. case 0:
149. if (currIndex == 1) {
150. animation = new TranslateAnimation(one, 0, 0, 0);
151. } else if (currIndex == 2) {
152. animation = new TranslateAnimation(two, 0, 0, 0);
153. }
154. break;
155. case 1:
156. if (currIndex == 0) {
157. animation = new TranslateAnimation(offset, one, 0, 0);
158. } else if (currIndex == 2) {
159. animation = new TranslateAnimation(two, one, 0, 0);
160. }
161. break;
162. case 2:
163. if (currIndex == 0) {
164. animation = new TranslateAnimation(offset, two, 0, 0);
165. } else if (currIndex == 1) {
166. animation = new TranslateAnimation(one, two, 0, 0);
167. }
168. break;
169.
170. }
171. */
172. new TranslateAnimation(one*currIndex, one*arg0, 0, 0);//显然这个比较简洁,只有一行代码。
173. currIndex = arg0;
174. true);// True:图片停在动画结束位置
175. 300);
176. imageView.startAnimation(animation);
177. this, "您选择了"+ viewPager.getCurrentItem()+"页卡", Toast.LENGTH_SHORT).show();
178. }
179.
180. }
181. }1. <?xml version="1.0" encoding="utf-8"?>
2. lt;LinearLayout xmlns:android="http:///apk/res/android"
3. "fill_parent"
4. "fill_parent"
5. "vertical" >
6.
7. <LinearLayout
8. "@+id/linearLayout1"
9. "fill_parent"
10. "40.0dip"
11. "#FFFFFF" >
12.
13. <TextView
14. "@+id/text1"
15. "fill_parent"
16. "fill_parent"
17. "1.0"
18. "center"
19. " @我"
20. "#000000"
21. "20.0dip" />
22.
23. <TextView
24. "@+id/text2"
25. "fill_parent"
26. "fill_parent"
27. "1.0"
28. "center"
29. "评论"
30. "#000000"
31. "20.0dip" />
32.
33. <TextView
34. "@+id/text3"
35. "fill_parent"
36. "fill_parent"
37. "1.0"
38. "center"
39. "私信"
40. "#000000"
41. "20.0dip" />
42. </LinearLayout>
43.
44. <ImageView
45. "@+id/cursor"
46. "fill_parent"
47. "wrap_content"
48. "matrix"
49. "@drawable/a" />
50.
51. <android.support.v4.view.ViewPager
52. "@+id/vPager"
53. "wrap_content"
54. "0dp"
55. "center"
56. "1.0"
57. "#000000"
58. "30"
59. "animation" />
60. lt;/LinearLayout>下面使用ViewPager来实现一个程序引导的demo:
一般来说,引导界面是出现第一次运行时出现的,之后不会再出现。所以需要记录是否是第一次使用程序,办法有很多,最容易想到的就是使用SharedPreferences来保存。步骤如下:
1、程序进入欢迎界面,SplashActivity,在这里读取SharedPreferences里面的变量,先设置为true。进入引导界面,然后设置为false。
2、之后每次进入欢迎界面读取SharedPreferences里面的变量,因为是false,所以不会运行引导界面了。
代码如下:
SplashActivity.java,欢迎界面。
1. import .Activity;
2. import android.content.Intent;
3. import android.content.SharedPreferences;
4. import android.os.Bundle;
5. import android.os.Handler;
6. import android.os.Message;
7.
8. /**
9.
10. */
11. public class SplashActivity extends Activity {
12. boolean isFirstIn = false;
13.
14. private static final int GO_HOME = 1000;
15. private static final int GO_GUIDE = 1001;
16. // 延迟3秒
17. private static final long SPLASH_DELAY_MILLIS = 3000;
18.
19. private static final String SHAREDPREFERENCES_NAME = "first_pref";
20.
21. /**
22. * Handler:跳转到不同界面
23. */
24. private Handler mHandler = new Handler() {
25.
26. @Override
27. public void handleMessage(Message msg) {
28. switch (msg.what) {
29. case GO_HOME:
30. goHome();
31. break;
32. case GO_GUIDE:
33. goGuide();
34. break;
35. }
36. super.handleMessage(msg);
37. }
38. };
39.
40. @Override
41. protected void onCreate(Bundle savedInstanceState) {
42. super.onCreate(savedInstanceState);
43. setContentView(R.layout.splash);
44.
45. init();
46. }
47.
48. private void init() {
49. // 读取SharedPreferences中需要的数据
50. // 使用SharedPreferences来记录程序的使用次数
51. SharedPreferences preferences = getSharedPreferences(
52. SHAREDPREFERENCES_NAME, MODE_PRIVATE);
53.
54. // 取得相应的值,如果没有该值,说明还未写入,用true作为默认值
55. "isFirstIn", true);
56.
57. // 判断程序与第几次运行,如果是第一次运行则跳转到引导界面,否则跳转到主界面
58. if (!isFirstIn) {
59. // 使用Handler的postDelayed方法,3秒后执行跳转到MainActivity
60. mHandler.sendEmptyMessageDelayed(GO_HOME, SPLASH_DELAY_MILLIS);
61. else {
62. mHandler.sendEmptyMessageDelayed(GO_GUIDE, SPLASH_DELAY_MILLIS);
63. }
64.
65. }
66.
67. private void goHome() {
68. new Intent(SplashActivity.this, MainActivity.class);
69. this.startActivity(intent);
70. this.finish();
71. }
72.
73. private void goGuide() {
74. new Intent(SplashActivity.this, GuideActivity.class);
75. this.startActivity(intent);
76. this.finish();
77. }
78. }1. import java.util.ArrayList;
2. import java.util.List;
3. import .Activity;
4. import android.os.Bundle;
5. import android.support.v4.view.ViewPager;
6. import android.support.v4.view.ViewPager.OnPageChangeListener;
7. import android.view.LayoutInflater;
8. import android.view.View;
9. import android.widget.ImageView;
10. import android.widget.LinearLayout;
11. import cn.eoe.leigo.splash.adapter.ViewPagerAdapter;
12.
13. /**
14. *
15.
16. *
17. */
18. public class GuideActivity extends Activity implements OnPageChangeListener {
19.
20. private ViewPager vp;
21. private ViewPagerAdapter vpAdapter;
22. private List<View> views;
23.
24. // 底部小点图片
25. private ImageView[] dots;
26.
27. // 记录当前选中位置
28. private int currentIndex;
29.
30. @Override
31. protected void onCreate(Bundle savedInstanceState) {
32. super.onCreate(savedInstanceState);
33. setContentView(R.layout.guide);
34.
35. // 初始化页面
36. initViews();
37.
38. // 初始化底部小点
39. initDots();
40. }
41.
42. private void initViews() {
43. this);
44.
45. new ArrayList<View>();
46. // 初始化引导图片列表
47. null));
48. null));
49. null));
50. null));
51.
52. // 初始化Adapter
53. new ViewPagerAdapter(views, this);
54.
55. vp = (ViewPager) findViewById(.viewpager);
56. vp.setAdapter(vpAdapter);
57. // 绑定回调
58. this);
59. }
60.
61. private void initDots() {
62. LinearLayout ll = (LinearLayout) findViewById(.ll);
63.
64. new ImageView[views.size()];
65.
66. // 循环取得小点图片
67. for (int i = 0; i < views.size(); i++) {
68. dots[i] = (ImageView) ll.getChildAt(i);
69. true);// 都设为灰色
70. }
71.
72. 0;
73. false);// 设置为白色,即选中状态
74. }
75.
76. private void setCurrentDot(int position) {
77. if (position < 0 || position > views.size() - 1
78. || currentIndex == position) {
79. return;
80. }
81.
82. false);
83. true);
84.
85. currentIndex = position;
86. }
87.
88. // 当滑动状态改变时调用
89. @Override
90. public void onPageScrollStateChanged(int arg0) {
91. }
92.
93. // 当当前页面被滑动时调用
94. @Override
95. public void onPageScrolled(int arg0, float arg1, int arg2) {
96. }
97.
98. // 当新的页面被选中时调用
99. @Override
100. public void onPageSelected(int arg0) {
101. // 设置底部小点选中状态
102. setCurrentDot(arg0);
103. }
104.
105. }1. import java.util.List;
2. import .Activity;
3. import android.content.Context;
4. import android.content.Intent;
5. import android.content.SharedPreferences;
6. import android.content.SharedPreferences.Editor;
7. import android.os.Parcelable;
8. import android.support.v4.view.PagerAdapter;
9. import android.support.v4.view.ViewPager;
10. import android.view.View;
11. import android.view.View.OnClickListener;
12. import android.widget.ImageView;
13. import cn.eoe.leigo.splash.MainActivity;
14. import cn.eoe.leigo.splash.R;
15.
16. /**
17. */
18. public class ViewPagerAdapter extends PagerAdapter {
19.
20. // 界面列表
21. private List<View> views;
22. private Activity activity;
23. private static final String SHAREDPREFERENCES_NAME = "first_pref";
24. public ViewPagerAdapter(List<View> views, Activity activity) {
25. this.views = views;
26. this.activity = activity;
27. }
28.
29. // 销毁arg1位置的界面
30. @Override
31. public void destroyItem(View arg0, int arg1, Object arg2) {
32. ((ViewPager) arg0).removeView(views.get(arg1));
33. }
34.
35. @Override
36. public void finishUpdate(View arg0) {
37. }
38.
39. // 获得当前界面数
40. @Override
41. public int getCount() {
42. if (views != null) {
43. return views.size();
44. }
45. return 0;
46. }
47.
48. // 初始化arg1位置的界面
49. @Override
50. public Object instantiateItem(View arg0, int arg1) {
51. 0);
52. if (arg1 == views.size() - 1) {
53. ImageView mStartWeiboImageButton = (ImageView) arg0
54. .findViewById(.iv_start_weibo);
55. new OnClickListener() {
56.
57. @Override
58. public void onClick(View v) {
59. // 设置已经引导
60. setGuided();
61. goHome();
62.
63. }
64.
65. });
66. }
67. return views.get(arg1);
68. }
69.
70. private void goHome() {
71. // 跳转
72. new Intent(activity, MainActivity.class);
73. activity.startActivity(intent);
74. activity.finish();
75. }
76. /**
77. *
78. * method desc:设置已经引导过了,下次启动不用再次引导
79. */
80. private void setGuided() {
81. SharedPreferences preferences = activity.getSharedPreferences(
82. SHAREDPREFERENCES_NAME, Context.MODE_PRIVATE);
83. Editor editor = preferences.edit();
84. // 存入数据
85. "isFirstIn", false);
86. // 提交修改
87. editor.commit();
88. }
89.
90. // 判断是否由对象生成界面
91. @Override
92. public boolean isViewFromObject(View arg0, Object arg1) {
93. return (arg0 == arg1);
94. }
95.
96. @Override
97. public void restoreState(Parcelable arg0, ClassLoader arg1) {
98. }
99.
100. @Override
101. public Parcelable saveState() {
102. return null;
103. }
104.
105. @Override
106. public void startUpdate(View arg0) {
107. }
108.
109. }效果如下:




所以总结一下,我们可以使用ViewPager做什么:
1.程序使用导航,外加底部圆点的效果,这个在微信示例里介绍了
2.页卡滑动,加上菜单的效果,不管是之前的支持手势也支持底部图标点击的微信,还是今天的微博。
代码下载连接
















