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 在第 ...
随机推荐
- $Django 支付宝支付,微信服务号推送消息 (测试需要把应用程序部署到服务器上)
一 支付宝支付 大概 支付宝支付 正式环境:需要用营业执照去申请商户号,appid 测试环境:沙箱环境:https://openhome.alipay.com/platform/appDaily.ht ...
- vue+cordova插件使用,bluetoothSerial.connect()连接失败
这是GitHub地址https://github.com/don/BluetoothSerial
- Java基础try-with-resource语法源码分析
众所周知,所有被打开的系统资源,比如流.文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故. 在Java的江湖中,存在着一种名为finally ...
- element ui table单选框点击全选问题
<template slot-scope="scope"> <el-radio-group v-model="scope.row.HandleState ...
- neo4j 学习笔记
1.参考 https://blog.csdn.net/appleyk/article/category/7408344 系列文章 (不支持 spring boo 2.0 以下的,入门可做参考) 2.底 ...
- #Node.js的fs导入遇到的问题和解决方案
一直在使用VS Code,今天打算用Node.js进行文件IO时候遇到了一些问题,fs是Node.js的核心功能之一,一开始我用Javascript编写fs模块的导入. var fs = requir ...
- 络谷AT941(水提高+)题解
蒟蒻刷水题的日常 这个题虽然模拟也不会超时,但我不喜欢模拟,能不模拟就不模拟,容易超时. 接下来进入正题: 实际上一开始是个很无聊的过程,你拿点,我拿点....贼无聊.我们可以把这个过程去掉.只看最后 ...
- BZOJ4836 [Lydsy1704月赛]二元运算 分治 多项式 FFT
原文链接http://www.cnblogs.com/zhouzhendong/p/8830036.html 题目传送门 - BZOJ4836 题意 定义二元运算$opt$满足 $$x\ opt\ y ...
- 最优装载—dp
最优装载—dp 动态规划 一 问题描述 二 问题分析 三 代码实现 package dp_Loading; import java.io.BufferedWriter; import java.io. ...
- swift中Cell的内容定制
1.cellForTitle 2.register