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 在第 ...
随机推荐
- PHP 【一】
输出 [输出在表格中] <!DOCTYPE html> <html> <body> <h1>My first PHP page</h1> ...
- I2C与EEPROM
一.基本概念 RAM(Random Access Memory)的全名为随机存取记忆体,它相当于PC机上的移动存储,用来存储和保存数据的.它在任何时候都可以读写,RAM 通常是作为操作系统或其他正在运 ...
- sed 使用行号与关键字匹配限定行范围
1.打印匹配数字4 到最后一行 [111 sed]$ cat input [111 sed]$ sed -n '/4/,$p' input
- 如何连接LINUX服务器
1.WINDOW下连接 使用PUTTY连接,链接如下:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 下载安装后打开,运行 ...
- fft,ntt
在被两题卡了常数之后,花了很久优化了自己的模板 现在的一般来说任意模数求逆1s跑3e5,exp跑1e5是没啥问题的(自己电脑,可能比luogu慢一倍) 当模数是$998244353,100453580 ...
- cookie报错
错误: java.lang.IllegalArgumentException: An invalid character [32] was present in the Cookie value 原因 ...
- Burnside引理与Polya定理 学习笔记
原文链接www.cnblogs.com/zhouzhendong/p/Burnside-Polya.html 问题模型 有一个长度为 $n$ 的序列,序列中的每一个元素有 $m$ 种取值. 如果两个序 ...
- 【Java】 剑指offer(11) 矩阵中的路径
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字 ...
- arraylist 为什么 删除元素时要使用迭代器而不能使用遍历
因为你要是遍历了,arraylist 的长度就变了,容易数组越界和下标问题 public class Test { public static void main(String[] args) ...
- 省市区地址三级联动jQuery插件Distpicker使用
插件下载地址 http://www.jq22.com/jquery-info8054 效果如下: 使用: 1.引入js <script src="http://www.jq22.com ...