Android的ViewPager的学习
这篇博客是对慕课网上看到的视频里学习到的知识的一些记录,让自己能够加深理解。视频地址:http://www.imooc.com/learn/1116
在这个视频中,目标是实现类似微信的主界面之间的切换,示例图如下:
ViewPager可以实现一个能够左右滑动切换的控件。

首先在布局中使用ViewPager控件,定义一些基本属性即可。
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:id="@+id/vp_main">
</android.support.v4.view.ViewPager>
然后先创建一个自定义的Fragment,然后再在MainActivity中使用FragmentPagerAdapter来填充ViewPager中的内容,
FragmentPagerAdapter与其他的Adapter的使用类似。
顺带一提这里也可以使用:FragmentStatePagerAdapter
FragmentStatePagerAdapter与FragmentPagerAdapter的区别:
在每个界面之间来回滑动时,当超出缓存区时
FragmentPagerAdapter会调用onDestroyView(Fragment没有被销毁)
而FragmentStatePagerAdapter会调用onDestroyView和onDestroy(Fragment被销毁)
可能会出现的问题有:当使用的Fragment特别多时,使用FragmentPagerAdapter会让内存变得很大,
所以具体的使用根据项目的不同来选择。
private void initViewPagerAdapter() {
//解除缓存的界面数量限制
mVpMain.setOffscreenPageLimit(mTitles.size());
mVpMain.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int i) {
TabFragment fragment = TabFragment.newInstance(mTitles.get(i));
return fragment;
}
@Override
public int getCount() {
return mTitles.size();
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
TabFragment fragment = (TabFragment) super.instantiateItem(container, position);
mFragment.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
mFragment.remove(position);
super.destroyItem(container, position, object);
}
});
其中newInstance方法是TabFragment中的方法,将当前的页面对应的标题传给TabFragment,之后TabFragment类得到这个标题再显示在页面上
这样写的好处是:当Activity被停掉之后再次启动时,显示的内容能够还原。
public static TabFragment newInstance(String title){
Bundle bundle = new Bundle();
bundle.putString(BUNDLE_KEY_TITLE, title);
TabFragment tabFragment = new TabFragment();
tabFragment.setArguments(bundle);
return tabFragment;
}
屏幕下方的四个按钮使用4个自己定义的TabView来实现,难点在于,如何实现这个TabView在切换到当前页面与没有切换时改变颜色
先在TabView中创建一个方法,使得这个View在收到传入的值是0的时候,显示成未被选中的样子,而在传入的值是1时,显示成
被选中的样子。
public void setProgress(float progress) {
//progress传入0的时候全黑(mIvIcon显示中)
//progress传入1的时候全绿(mIvIconSelect显示中)
//mIvIcon和mIvIconSelect代表选中与未选中的图片样式
mIvIcon.setAlpha(1 - progress);
mIvIconSelect.setAlpha(progress);
}
下面这个自动生成的方法中有一个参数,positionOffset,当从左往右滑动时,这个参数会逐渐由0变1,从右往左滑时,会从1变0
于是在这个方法中写入以下代码,使得从第一个转到第二个时,第一个的参数由1变0,第二个的参数由0变1,第二个转到第一个时
第一个的参数由0变1,第二个的参数由1变0,这样就能实现颜色的转换
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixel) { if(positionOffset > 0) {
TabView left = mTabs.get(position);
TabView right = mTabs.get(position + 1);
left.setProgress(1 - positionOffset);
right.setProgress(positionOffset);
}
}
这样,切换的操作就能完成了。
Android的ViewPager的学习的更多相关文章
- android之ViewPager
在android中ViewPager是非常常用的控件.它在android.support.v4.view.ViewPager下.你们自己可以进http://developer.android.com/ ...
- android使用ViewPager实现欢迎引导页
android使用ViewPager实现欢迎引导页 大多数APP第一次启动的时候,都会有一个引导界面,左右滑动,到最后一张,用户点击才再次进入主界面.当第二次启动的时候,则直接进入主界面. 这种效果一 ...
- Android中ViewPager实现滑动条及与Fragment结合的实例教程
ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...
- Android 开源项目及其学习
Android 系统研究:http://blog.csdn.net/luoshengyang/article/details/8923485 Android 腾讯技术人员博客 http://hukai ...
- Android中viewPager的一两点使用
Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...
- Android自动化测试之Monkeyrunner学习笔记(一)
Android自动化测试之Monkeyrunner学习笔记(一) 因项目需要,开始研究Android自动化测试方法,对其中的一些工具.方法和框架做了一些简单的整理,其中包括Monkey.Monkeyr ...
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- Android(java)学习笔记267:Android线程池形态
1. 线程池简介 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...
- Android listview viewpager解决冲突 滑动
Android listview viewpager滑动 跳动 冲突解决 ListView中嵌套ViewPage有或者滑动手势冲突解决 在listview 上使用 addHeaderView 在第 ...
随机推荐
- 论文阅读笔记:《Contextual String Embeddings for Sequence Labeling》
文章引起我关注的主要原因是在CoNLL03 NER的F1值超过BERT达到了93.09左右,名副其实的state-of-art.考虑到BERT训练的数据量和参数量都极大,而该文方法只用一个GPU训了一 ...
- python 读写文件中 w与wt ; r与rt 的区别
w,r,wt,rt都是python里面文件操作的模式.w是写模式,r是读模式.t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符.类Unix平 ...
- 【原创】运维基础之Docker(4)实用工具ctop
ctop类似于top,top监控的是进程,ctop监控的是容器(container top) 安装 # wget https://github.com/bcicen/ctop/releases/dow ...
- 克隆虚拟机+Linux互相登录+秘钥认证(四)
1.虚拟机右键管理_克隆 修改虚拟机名称后完成! 2.开机启动虚拟机 随时保存快照 3.开启两台虚拟机,进行互相登录切换!(W命令查看系统负载) 补充: IP登录: ssh IP: 例如:ssh 19 ...
- Django—模型
索引 1.定义模型类 2.模型类 3.字段查询 4.查询集 5.模型类关系 6.模型类扩展 ORM简介 ORM,全拼Object-Relation Mapping,中文意为对象-关系映射,是随着面向对 ...
- VMware虚拟机下安装CentOS6.5
点击创建虚拟机 选择典型—>下一步 选择安装iso映像文件—>点击浏览选择下载好的centos 镜像文件—>下一步 设置用户和密码—>下一步 设置虚拟机的名字和位置 指定磁盘大 ...
- Win7+keras+tensorflow使用YOLO-v3训练自己的数据集
一.下载和测试模型 1. 下载YOLO-v3 git clone https://github.com/qqwweee/keras-yolo3.git 这是在Ubuntu里的命令,windows直接去 ...
- Redis数据结构之intset
本文及后续文章,Redis版本均是v3.2.8 上篇文章<Redis数据结构之robj>,我们说到redis object数据结构,其有5中数据类型:OBJ_STRING,OBJ_LIST ...
- Failed global initialization:FileNotOpen: Failed to open "C:\MongoDB\data\log\mongo.log" 安装MongoDB时卡死
在安装MongoDB的时候,下载了3.6版本,安装过程中发现到一半就卡死了,后面换了一个较低版本的才安装成功 这里是所有MongoDB版本的下载地址: https://www.mongodb.org/ ...
- There is no getter for property named 'XXX' in 'class java.lang.String'解决方法
<select id="ProjectHomePage" parameterType="string" resultType="java.uti ...