有暇,总结一下viewpager+fragment的使用。

先来看看效果图:



有三个标题,三个fragment,滑动时标题的颜色会随着变化。

MainActivity.java

public class MainActivity extends FragmentActivity {

    private ViewPager vp;
private Fragment f1, f2, f3;
//把所有的Fragment装到一个List中
private List<Fragment> fs;
private FragmentPagerAdapter fpa;
private TextView tv1, tv2, tv3; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vp = (ViewPager) this.findViewById(R.id.vp1); initView(); //一个适配器,里边存的都是Fragment
fpa = new FragmentPagerAdapter(getSupportFragmentManager()) { @Override
public int getCount() {
return fs.size();
} @Override
public Fragment getItem(int arg0) {
return fs.get(arg0);
}
}; vp.setAdapter(fpa); /**
* 三个方法的执行顺序为:用手指拖动翻页时,最先执行一遍onPageScrollStateChanged(1),
* 然后不断执行onPageScrolled,放手指的时候,直接立即执行一次onPageScrollStateChanged(2),
* 然后立即执行一次onPageSelected,然后再不断执行onPageScrolled,
* 最后执行一次onPageScrollStateChanged(0)。
*/
vp.setOnPageChangeListener(new OnPageChangeListener() { /**
* position代表哪个页面被选中
*/
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
changeTitleBackground(0);
break;
case 1:
changeTitleBackground(1);
break;
case 2:
changeTitleBackground(2);
break;
default:
break;
}
Log.i("lenve", "onPageSelected"+position);
} /**
* 有三个参数,第一个position,这个参数要特别注意一下。当用手指滑动时,如果手指按在页面上不动,
* position和当前页面index是一致的
* 如果手指向左拖动(相应页面向右翻动),这时候position大部分时间和当前页面是一致的,
* 只有翻页成功的情况下最后一次调用才会变为目标页面;如果手指向右拖动(相应页面向左翻动),
* 这时候position大部分时间和目标页面是一致的,只有翻页不成功的情况下最后一次调用才会变为原页面。
* 当直接设置setCurrentItem翻页时,如果是相邻的情况(比如现在是第二个页面,跳到第一或者第三个页面),
* 如果页面向右翻动,大部分时间是和当前页面是一致的,只有最后才变成目标页面;如果向左翻动,position和目标页面是一致的。
* 这和用手指拖动页面翻动是基本一致的。
* 如果不是相邻的情况,比如我从第一个页面跳到第三个页面,position先是0,然后逐步变成1,
* 然后逐步变成2;我从第三个页面跳到第一个页面, position先是1,然后逐步变成0,并没有出现为2的情况。
* positionOffset是当前页面滑动比例,如果页面向右翻动,这个值不断变大,最后在趋近1的情况后突变为0。
* 如果页面向左翻动,这个值不断变小,最后变为0。
* positionOffsetPixels是当前页面滑动像素,变化情况和positionOffset一致。
*/
// 在屏幕滚动过程中不断被调用
@Override
public void onPageScrolled(int position,float positionOffset, int positionOffsetPixels) {
Log.i("lenve", "onPageScrolled"+position);
} /**
* onPageScrollStateChanged(int state):这个方法在手指操作屏幕的时候发生变化。
* 有三个值:0(END),1(PRESS) , 2(UP) 。 当用手指滑动翻页时,手指按下去的时候会触发这个方法,state值为1
* 手指抬起时,如果发生了滑动(即使很小),这个值会变为2,然后最后变为0
* 总共执行这个方法三次。一种特殊情况是手指按下去以后一点滑动也没有发生,这个时候只会调用这个方法两次,state值分别是1,0 。
* 当setCurrentItem翻页时,会执行这个方法两次,state值分别为2 , 0 。
*/
@Override
public void onPageScrollStateChanged(int state) {
Log.i("lenve", "onPageScrollStateChanged"+state);
}
});
//设置默认显示页
vp.setCurrentItem(0);
} private void initView() { tv1 = (TextView) this.findViewById(R.id.tv1);
tv2 = (TextView) this.findViewById(R.id.tv2);
tv3 = (TextView) this.findViewById(R.id.tv3);
//设置tv1的默认颜色
tv1.setTextColor(Color.GREEN); fs = new ArrayList<Fragment>(); f1 = new Fragment1();
f2 = new Fragment2();
f3 = new Fragment3();
fs.add(f1);
fs.add(f2);
fs.add(f3);
} //滑动时修改标题颜色
private void changeTitleBackground(int i) {
switch (i) {
case 0:
tv1.setTextColor(Color.GREEN);
tv2.setTextColor(Color.GRAY);
tv3.setTextColor(Color.GRAY);
break;
case 1:
tv1.setTextColor(Color.GRAY);
tv2.setTextColor(Color.GREEN);
tv3.setTextColor(Color.GRAY);
break;
case 2:
tv1.setTextColor(Color.GRAY);
tv2.setTextColor(Color.GRAY);
tv3.setTextColor(Color.GREEN);
break;
default:
break;
}
}
}

注释里边说的比较清楚了,再看看布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.viewpagertest.MainActivity" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="f1" /> <TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="f2" /> <TextView
android:id="@+id/tv3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:text="f3" />
</LinearLayout> <android.support.v4.view.ViewPager
android:id="@+id/vp1"
android:layout_width="match_parent"
android:layout_height="match_parent" /> </LinearLayout>

另外,三个fragment都是普通的fragment,这里就不贴代码了。

本项目源码下载

版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。

viewpager+fragment学习笔记的更多相关文章

  1. Fragment 学习笔记(1)

    网上关于Fragment相关的博客资料很多,写关于这个知识笔记是加深记忆,大神略过: 0x01 了解Fragment 当然看官方文档(http://www.android-doc.com/refere ...

  2. Android Fragment学习笔记(二)----Fragment界面添加和管理

    Fragment界面添加 了解过fragment的生命周期等简单知识,于是去看官方文档来了解更多相关内容,要添加fragment到我们的UI界面中,给出了两种常用的方法,第一个是在activity的布 ...

  3. Fragment学习笔记

    Fragment为大量型号,尺寸,分辨率的设备提供了一种统一的UI优化方案.将Activity分解为多个Fragment,将极大地提高UI的灵活性,也更容易为一些新的设备配置带来更好的用户体验. on ...

  4. Android之Fragment学习笔记②(Fragment生命周期)

    一. Fragment生命周期图                                  二.Fragment生命周期方法介绍 Fragment的生命周期和activity生命周期很像,其生 ...

  5. Android之Fragment学习笔记①

    Android Fragment完全解析,关于碎片你所需知道的一切 一. 什么是FragmentFragment(碎片)就是小型的Activity,它是在Android3.0时出现的.Fragment ...

  6. [android]p7-1 fragment学习笔记

    本文源自<android权威编程指南第3版>第7章UI fragment与fragment 第7章主要内容是实现一个记录不良行为的APP(部分实现),有列表,有具体的行为内容显示.第7章主 ...

  7. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  8. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  9. 两千行PHP学习笔记

    亲们,如约而至的PHP笔记来啦~绝对干货! 以下为我以前学PHP时做的笔记,时不时的也会添加一些基础知识点进去,有时还翻出来查查. MySQL笔记:一千行MySQL学习笔记http://www.cnb ...

随机推荐

  1. ubuntu修改主机名称

    一.为何要修改主机名称 在安装Ubuntu时,一不小心主机名称输入的“too long”了,导致命令行上就提示符占据了一行的1/3,迫使我产生修改主机名称的冲动. 二.操作方法 原理:系统启动时,会从 ...

  2. PHPStorm——配置修改

    字体修改: FiraCode字体:https://github.com/tonsky/FiraCode 1.双击安装字体 2. 关闭错别字检测

  3. hexdump——Linux系统的二进制文件查看工具

    hexdump是Linux下的一个二进制文件查看工具,可以将二进制文件转换为ASCII.10进制.16进制或8进制进行查看. 首先我们准备一个测试用的文件test,十六进制如下: 00 01 02 0 ...

  4. Servo: The Embeddable Browser Engine

    Embedding, in the context of this article, is the process of hosting a web rendering engine inside a ...

  5. 浅谈C# .Net技术面试 , 正在找工作的人一定要看看

    1.引子 最近一直在负责.net(B/S方向)技术面试相关的工作,前前后后面试了不少人,但是通过率较低,大概只有20%左右:有颇多感慨. 最近也一直比较困惑,原因究竟是什么? 是我们要求太高,应聘者本 ...

  6. 居然还有WM_TIMECHANGE(只在用户手动改变系统时间时才会产生作用)

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  7. Delphi 在任务栏隐藏程序图标

    Delphi 在任务栏隐藏程序图标 方法一:1.修改工程文件中的“Application.MainFormOnTaskbar := True;”为“Application.MainFormOnTask ...

  8. 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器

    14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器 这个章节描述技术关于移动或者复制一些或者所 ...

  9. HDU-4920 Matrix multiplication

    矩阵相乘,采用一行的去访问,比采用一列访问时间更短,根据数组是一行去储存的.神奇小代码. Matrix multiplication Time Limit: 4000/2000 MS (Java/Ot ...

  10. 笔记-人老了-github

    其实GITHUB是很不错的,虽然之前的JD泄露那件事情,后果很严重. 但是作为个人使用很不错的. github使用入门: 1:申请一个帐号 2:github使用ssh推送的.(ssh走的是加密) 所以 ...