现在很多app一打开就是一个viewpager,然后可以用手指滑,每滑一次就换一张图,底下还会有圈圈表示说现在滑到第几章~
通常这些图片都是放功能简介或是使用教学之类的,我的需求很简单,就是上面提到的那样而已。
有两种做法,一种是找现有套件,查了一堆资料每个都跟我推荐viewpagerindicator这套,我之前也看过这套,只是看起来需要有fragment再加上google play范例好像载不到了,所以只好自己实做一个。
viewpager的实作可参考android viewpager使用详解里面的程序码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
@overrideprotected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_intro); mviewpager = (viewpager) findviewbyid(r.id.viewpager); final layoutinflater minflater = getlayoutinflater().from( this ); view v1 = minflater.inflate(r.layout.intro_layout_1, null ); view v2 = minflater.inflate(r.layout.intro_layout_2, null ); view v3 = minflater.inflate(r.layout.intro_layout_3, null ); view v4 = minflater.inflate(r.layout.intro_layout_4, null ); viewlist = new arraylist<view>(); viewlist.add(v1); viewlist.add(v2); viewlist.add(v3); viewlist.add(v4); mviewpager.setadapter( new myviewpageradapter(viewlist)); mviewpager.setcurrentitem( 0 );} myviewpageradapter 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((view) object); } @override public object instantiateitem(viewgroup container, int position) { view view = mlistviews.get(position); container.addview(view); return view; } @override public int getcount() { return mlistviews.size(); } @override public boolean isviewfromobject(view arg0, object arg1) { return arg0==arg1; }} |
这样子你就有一个viewpager了
下面我们来具体看一下viewpager的用法:
一、viewpager创建步骤
① 在xml布局中加入android.support.v4.view.viewpager
② 加载显示的页卡将layout布局转换为view对象
(1)
1
2
|
layoutinflater lf getlayoutinflater().from( this ); lf.inflate(resource,root); |
(2)
1
|
view.inflate(context,resource,root); |
③ 配置adapter(三种adapter)
(1)pageradapter 数据源:list<view>
(2)fragmentpageradapter 数据源:list<fragment>
(3)fragmentstatepageradapter 数据源:list<fragment>
二、代码示例
新建四个fragment和他们的布局下面是mainactivity的xml布局:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<android.support.v4.view.viewpager android:id= "@+id/pager" android:layout_width= "match_parent" android:layout_height= "match_parent" android:layout_gravity= "center" > <android.support.v4.view.pagertabstrip android:id= "@+id/tab" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_gravity= "top" > </android.support.v4.view.pagertabstrip> <!-- 底部显示标题与上面的顶部显示不能同时出现 <android.support.v4.view.pagertitlestrip android:id= "@+id/title" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:layout_gravity= "bottom" > </android.support.v4.view.pagertitlestrip> --> </android.support.v4.view.viewpager> |
第一种pageradapter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public class mypageradapter extends pageradapter { private list<view> viewlist; private list<string> titlelist; public mypageradapter(list<view> viewlist,list<string> titlelist){ this .viewlist = viewlist; this .titlelist = titlelist; } /** * 返回页卡的数量 */ @override public int getcount() { return viewlist.size(); } /** * view是否来自对象 */ @override public boolean isviewfromobject(view arg0, object arg1) { return arg0==arg1; } /** * 实例化一个页卡 */ @override public object instantiateitem(viewgroup container, int position) { container.addview(viewlist.get(position)); return viewlist.get(position); } /** * 销毁一个页卡 */ @override public void destroyitem(viewgroup container, int position, object object) { container.removeview(viewlist.get(position)); } /** * 设置viewpager的标题 */ @override public charsequence getpagetitle( int position) { return titlelist.get(position); } } |
第二种fragmentpageradapter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public class myfragmentpageradapter extends fragmentpageradapter { private list<fragment> fraglist; private list<string> titlelist; public myfragmentpageradapter(fragmentmanager fm,list<fragment> fraglist,list<string> titlelist) { super (fm); this .fraglist = fraglist; this .titlelist = titlelist; } @override public fragment getitem( int arg0) { return fraglist.get(arg0); } @override public charsequence getpagetitle( int position) { return titlelist.get(position); } @override public int getcount() { return fraglist.size(); } } |
第三种fragmentstatepageradapter(该适配器可以动态销毁fragment)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public class myfragmentpageradapter2 extends fragmentstatepageradapter { //该适配器可以动态销毁 private list<fragment> fraglist; private list<string> titlelist; public myfragmentpageradapter2(fragmentmanager fm,list<fragment> fraglist,list<string> titlelist) { super (fm); this .fraglist = fraglist; this .titlelist = titlelist; } @override public fragment getitem( int arg0) { return fraglist.get(arg0); } @override public charsequence getpagetitle( int position) { return titlelist.get(position); } @override public int getcount() { return fraglist.size(); } @override public object instantiateitem(viewgroup arg0, int arg1) { return super .instantiateitem(arg0, arg1); } @override public void destroyitem(viewgroup container, int position, object object) { super .destroyitem(container, position, object); } } |
mainactivity里使用getsupportfragmentmanager()该activity必须继承fragmentactivity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
public class mainactivity extends fragmentactivity implements onpagechangelistener{ private list<view> viewlist; private list<string> titlelist; private viewpager pager; private pagertabstrip tab; //顶部标题 private list<fragment> fraglist; @override protected void oncreate(bundle savedinstancestate) { super .oncreate(savedinstancestate); setcontentview(r.layout.activity_main); viewlist = new arraylist<view>(); titlelist = new arraylist<string>(); tab = (pagertabstrip) findviewbyid(r.id.tab); view view1 = view.inflate( this ,r.layout.view1, null ); view view2 = view.inflate( this ,r.layout.view2, null ); view view3 = view.inflate( this ,r.layout.view3, null ); view view4 = view.inflate( this ,r.layout.view4, null ); viewlist.add(view1); viewlist.add(view2); viewlist.add(view3); viewlist.add(view4); fraglist = new arraylist<fragment>(); fraglist.add( new fragment1()); fraglist.add( new fragment2()); fraglist.add( new fragment3()); fraglist.add( new fragment4()); //为viewpager页卡设置标题 titlelist.add( "第一页" ); titlelist.add( "第二页" ); titlelist.add( "第三页" ); titlelist.add( "第四页" ); //为pagertabstrip设置一些属性 tab.setbackgroundcolor(color.white); tab.setdrawfullunderline( false ); tab.settabindicatorcolor(color.blue); pager = (viewpager) findviewbyid(r.id.pager); //mypageradapter adapter = new mypageradapter(viewlist,titlelist); //myfragmentpageradapter adapter = new myfragmentpageradapter(getsupportfragmentmanager(), fraglist, titlelist); /** * 使用getsupportfragmentmanager()该activity必须继承fragmentactivity */ myfragmentpageradapter2 adapter = new myfragmentpageradapter2(getsupportfragmentmanager(), fraglist, titlelist); pager.setadapter(adapter); pager.setonpagechangelistener( this ); } @override public void onpagescrollstatechanged( int arg0) { } @override public void onpagescrolled( int arg0, float arg1, int arg2) { } @override public void onpageselected( int arg0) { toast.maketext( this , "当前是第" +(arg0+ 1 )+ "个界面" , 0 ).show(); } } |