- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android应用中使用ViewPager实现类似QQ的界面切换效果由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
这几天在研究viewpager,简单的写一下如何使用viewpager实现类似于qq的“最近联系人、好友、群组”的界面切换(不知道他们是不是用这个方法实现的)。 viewpager已经在android-sdk中加入了,具体的位置在%android_sdk_home%\android-compatibility\v4,%android_sdk_home%是你的android-sdk-windows目录.
好,下面放一张效果图:
步骤一:新建一个工程,我的是viewpager 步骤二:导入jar包 具体如下: 右键工程--properties--单击左侧java build path--单击右侧libraries标签--单击右侧add external jars--选择上面描述位置的jar包,保存 。
步骤三:编写一个主界面,加入android.support.v4.view.viewpager组件 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<linearlayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:orientation=
"vertical"
>
<textview
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"@string/hello"
/>
<android.support.v4.view.viewpager
android:id=
"@+id/mviewpager"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
/>
</linearlayout>
|
。
步骤四:编写三个要添加进来的界面 界面都很简单,随便写的 界面1 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<linearlayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:background=
"#ff0000"
android:orientation=
"vertical"
>
<button
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"layout1"
/>
</linearlayout>
|
界面2 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<linearlayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:background=
"#00ff00"
android:orientation=
"vertical"
>
<textview
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"layout2"
/>
</linearlayout>
|
。
界面3 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<linearlayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:background=
"#0000ff"
android:orientation=
"vertical"
>
<textview
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"layout3"
/>
</linearlayout>
|
。
步骤五:编写主类,我的名字是叫viewpageractivity 。
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
package
com.carter.viewpager;
import
java.util.arraylist;
import
java.util.list;
import
java.util.zip.inflater;
import
android.app.activity;
import
android.app.activitygroup;
import
android.content.intent;
import
android.os.bundle;
import
android.support.v4.view.pageradapter;
import
android.support.v4.view.viewpager;
import
android.support.v4.view.viewpager.onpagechangelistener;
import
android.util.log;
import
android.view.layoutinflater;
import
android.view.view;
import
android.view.viewgroup;
public
class
viewpageractivity
extends
activitygroup {
/**
* 能够支持滑动的组件
*/
viewpager mviewpager;
/**
* viewpager 需要设置该adapter才能实现添加界面,
* 该adapter继承自pageradapter
*/
mypageradapter adapter;
/**
* 用于保存三个界面
*/
list<view> list;
/**
* 用于生成界面
*/
layoutinflater minflater;
/** called when the activity is first created. */
@override
public
void
oncreate(bundle savedinstancestate) {
super
.oncreate(savedinstancestate);
setcontentview(r.layout.main);
minflater =
this
.getlayoutinflater();
/**
* 添加进来三个界面到list,用于初始化pageradapter
*/
list =
new
arraylist<view>();
list.add(
this
.getlocalactivitymanager().startactivity(
"layout1"
,
new
intent(viewpageractivity.
this
, layout1activity.
class
)).getdecorview());
list.add(minflater.inflate(r.layout.layout2,
null
));
list.add(minflater.inflate(r.layout.layout3,
null
));
mviewpager = (viewpager)findviewbyid(r.id.mviewpager);
adapter =
new
mypageradapter(list);
mviewpager.setadapter(adapter);
/**
* 为viewpager添加pagechangelistener,在回调的方法中可以完成其他的事情,例如处理一些界面标签的转换之类的,如果你有标签栏的话
*/
mviewpager.setonpagechangelistener(
new
onpagechangelistener() {
@override
public
void
onpageselected(
int
arg0) {
// todo auto-generated method stub
log.i(
"carter"
,
"onpageselected"
);
}
@override
public
void
onpagescrolled(
int
arg0,
float
arg1,
int
arg2) {
// todo auto-generated method stub
}
@override
public
void
onpagescrollstatechanged(
int
arg0) {
// todo auto-generated method stub
}
});
}
class
mypageradapter
extends
pageradapter
{
list<view> mlist;
public
mypageradapter(list<view> list){
mlist = list;
}
@override
public
int
getcount() {
// todo auto-generated method stub
return
mlist.size();
}
@override
public
boolean
isviewfromobject(view arg0, object arg1) {
// todo auto-generated method stub
return
arg0 == (arg1);
}
@override
public
void
destroyitem(view container,
int
position, object object) {
// todo auto-generated method stub
((viewpager)container).removeview(mlist.get(position));
}
@override
public
object instantiateitem(view container,
int
position) {
// todo auto-generated method stub
((viewpager)container).addview(mlist.get(position),
0
);
return
mlist.get(position);
}
@override
public
void
finishupdate(viewgroup container) {
// todo auto-generated method stub
super
.finishupdate(container);
}
}
}
|
。
代码解读: 1、在上面重写了pageradapter,在里面最重要的方法就是 。
1
2
3
4
5
6
|
@override
public
object instantiateitem(view container,
int
position) {
// todo auto-generated method stub
((viewpager)container).addview(mlist.get(position),
0
);
return
mlist.get(position);
}
|
具体为什么每次都是addview到0的位置,目前我还不知道,这个也是从网上找了一个方法看到的.
2、在初始化list的时候,里面包含的内容是一个个的view元素,在我的了解范围内有两种方法 第一种就是通过添加window的getdecorview()来得到一个view; 第二种就是通过layoutinflater,从xml中生成一个view。 需要注意的是,第一种方法,需要主类继承自activitygroup,这样才能在添加时使用getlocalactivitymanager以及之后的方法,需要生成的activity,例如本例中的layout1activity,要在androidmanifest.xml中声明.
1
2
3
4
5
6
7
|
/**
* 添加进来三个界面到list,用于初始化pageradapter
*/
list =
new
arraylist<view>();
list.add(
this
.getlocalactivitymanager().startactivity(
"layout1"
,
new
intent(viewpageractivity.
this
, layout1activity.
class
)).getdecorview());
list.add(minflater.inflate(r.layout.layout2,
null
));
list.add(minflater.inflate(r.layout.layout3,
null
));
|
3、如果只是从xml生成view来添加的话,完全可以移除继承activitygroup。 4、如果使用startactivity的方法来启动,需要添加进来的几个activity,是一起在加入时就初始化的,可以通过在oncreate()方法中打log看出来.
ps:如何解决android下viewpager和pageradapter中调用notifydatasetchanged失效的问题 具体讲解如下: google在android 3.0sdk中推出的viewpager控件很大程度上满足了开发者开发页面左右移动切换的功能,使用非常方便。但是使用中发现,在删除或者修改数据的时候,pageradapter无法像baseadapter那样仅通过notifydatasetchanged方法通知刷新view。 最基本的方法: 针对于child view比较简单的情况(例如仅有textview、imageview等,没有listview等展示数据的情况),可以在自己的adapter中加入代码:
1
2
3
4
|
@override
public
int
getitemposition(object object) {
return
position_none;
}
|
这样既可达到一般情况下要求的效果。 存在的问题: 这不是pageradapter中的bug,通常情况下,调用notifydatasetchanged方法会让viewpager通过adapter的getitemposition方法查询一遍所有child view,这种情况下,所有child view位置均为position_none,表示所有的child view都不存在,viewpager会调用destroyitem方法销毁,并且重新生成,加大系统开销,并在一些复杂情况下导致逻辑问题。特别是对于只是希望更新child view内容的时候,造成了完全不必要的开销。 更有效地方法: 更为靠谱的方法是因地制宜,根据自己的需求来实现notifydatasetchanged的功能,比如,在仅需要对某个view内容进行更新时,在instantiateitem()时,用view.settag方法加入标志,在需要更新信息时,通过findviewwithtag的方法找到对应的view进行更新即可.
最后此篇关于Android应用中使用ViewPager实现类似QQ的界面切换效果的文章就讲到这里了,如果你想了解更多关于Android应用中使用ViewPager实现类似QQ的界面切换效果的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我目前面临将 ViewPager 放入另一个 ViewPager 中的问题,两者都可滑动。我成功创建了我的第一个 ViewPager,它包含三个页面,中间一个是第二个(内部)ViewPager,其中包
在我的主要 Activity 中,我有一个水平 viewpager。在 viewpager 的一个 fragment 中,我有另一个垂直 viewpager。两者都很好。但是对于水平 viewpage
我想创建一个 ViewPager(包含三个项目),其中每个 View 都是另一个 ViewPager(包含两个项目)。用户然后像这样滑动项目: ViewPager1[0] ViewPager2[0]
如何修复这个错误 setupWithViewPager(android.support.v4.view.ViewPager) in TabLayout cannot br applied to (an
我有一个包含 3 张图片的数组的 viewPage,我想在缩放其中一张时锁定 viewPager,因为当我在右侧滚动时,会出现下一张照片!这是我的代码 enter code here public
我是第一次实现 ViewPager,我遇到了一些问题,因为我收到以下错误: 06-20 10:40:51.366 11377-11377/com.example.ruelas.elite E/Andr
我真的是 android 的新手,如果对我的类(class)作业有任何帮助,我将不胜感激。 我需要做的: 1) 在一个 Activity 中有两个 ViewPagers(未嵌套) 2)两个ViewPa
我正在自定义我的 Android 应用程序以在四个方向上滑动,我正在使用 ViewPager 水平 和 VerticalViewPager 滑动垂直滑动(这就像对 DirectionalViewPag
我需要为平板电脑创建一个 ViewPager,在平板电脑的左侧会有导航按钮供用户选择。例如。 左侧导航将有 4 个图像按钮,每个项目将用户带到不同的教程。每个图像按钮都会加载一个 ViewPager。
我用过Vertical Viewpager在我的显示数据集合的项目中。在单个数据(项目)中,我有更多图像要显示。所以我尝试使用 viewpager。 但是当我水平滚动时,它会阻止垂直 Viewpage
我有一个父级 ViewPager,它的每个页面都包含一个子级 ViewPager。子 ViewPager 可能包含一个 ListView 或一个垂直的 ScrollView。我想将子级 ViewPag
我的任务是创建一个非常不正统的布局,只能通过另一个 viewpager 的第二个 Pane 内的 viewpager 来完成,幸运的是外部 viewpager 需要被锁定所以任务更现实一些,但是意外的
目标是根据屏幕方向(纵向或横向)以不同的布局在屏幕上显示两个 fragment ( fragment A、 fragment B)。 当设备处于纵向模式时,一次仅显示 Frag A 和 Frag B
我想禁用父 viewpager 中的子 viewpager 的滑动。 我目前使用这个自定义子 viewpager public class CustomViewPager extends ViewPa
我有两个 ViewPager - 一个在另一个下面。现在客户希望我们添加扩展底部 ViewPager(具有三个 ListView)以覆盖顶部 ViewPager 的可能性。当我将两个 ViewPage
我用谷歌搜索了这个问题很多天。找到一个解决方案,在Viewpager的开头和结尾添加一个空白View。当viewpager.getcurrentItem()==0时,则重新指向1。在我看来这种做法非常
我从适配器设置标题后,标题未出现在 PagerTabStrip 中 这是我的 Activity public class MainActivity extends AppCompatActivity
我有一个 ViewPager,其中包含多个 TextView,它们具有不同的字体大小。此外,我还获得了增加/减少字体大小的按钮,通过添加其默认大小加上一个名为 STEP 的值(该值通过 inc/dec
我有一个嵌套的 ViewPager,效果非常好。唯一的问题是,一旦子 ViewPager 位于最后一项并且我进一步滚动,父 ViewPager 就会滚动。我不想要这种行为。 我如何实现这一目标? 这是
我想显示一个带有滑动抽屉的 Viewpager。Viewpager 用于滚动图像,我想在该 viewpager 的顶部放置一个滑动抽屉(从顶部到按钮)。 我附上了我的示例代码。如果您对如何实现此屏幕有
我是一名优秀的程序员,十分优秀!