ViewPager+Fragment可以做出多页面滑动效果,让我们的应用程序界面操作起来更加灵活

对于ViewPager和Fragment组件还不熟悉的朋友,可以先看看相关的资料.

首先在activity_main.xml布局文件中加入ViewPager组件

  1. <android.support.v4.view.ViewPager
  2. android:id="@+id/viewpager"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">

既然要实现左右的页面滑动,肯定要往ViewPager中添加一些View视图或者Fragment,这里创建了3个Fragment的布局文件

这3个布局文件非常简单,跟Activity的布局用法一模一样,代码就不贴出来了,直接看Activity的java代码:

  1. package huahua.viewpager;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import android.os.Bundle;
  7. import android.app.Activity;
  8. import android.support.v4.app.Fragment;
  9. import android.support.v4.app.FragmentActivity;
  10. import android.support.v4.app.FragmentManager;
  11. import android.support.v4.app.FragmentPagerAdapter;
  12. import android.support.v4.app.FragmentStatePagerAdapter;
  13. import android.support.v4.view.PagerTabStrip;
  14. import android.support.v4.view.PagerTitleStrip;
  15. import android.support.v4.view.ViewPager;
  16. import android.util.Log;
  17. import android.view.ViewGroup;
  18.  
  19. public class MainActivity extends FragmentActivity {
  20. private ViewPager m_vp;
  21. private fragment1 mfragment1;
  22. private fragment2 mfragment2;
  23. private fragment3 mfragment3;
  24. //页面列表
  25. private ArrayList<Fragment> fragmentList;
  26. //标题列表
  27. ArrayList<String> titleList = new ArrayList<String>();
  28. //通过pagerTabStrip可以设置标题的属性
  29. private PagerTabStrip pagerTabStrip;
  30.  
  31. private PagerTitleStrip pagerTitleStrip;
  32. @Override
  33. protected void onCreate(Bundle savedInstanceState) {
  34. super.onCreate(savedInstanceState);
  35. setContentView(R.layout.activity_main);
  36.  
  37. m_vp = (ViewPager)findViewById(R.id.viewpager);
  38.  
  39. pagerTabStrip=(PagerTabStrip) findViewById(R.id.pagertab);
  40. //设置下划线的颜色
  41. pagerTabStrip.setTabIndicatorColor(getResources().getColor(android.R.color.holo_green_dark));
  42. //设置背景的颜色
  43. pagerTabStrip.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_dark));
  44.  
  45. // pagerTitleStrip=(PagerTitleStrip) findViewById(R.id.pagertab);
  46. // //设置背景的颜色
  47. // pagerTitleStrip.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_dark));
  48.  
  49. mfragment1 = new fragment1();
  50. mfragment2 = new fragment2();
  51. mfragment3 = new fragment3();
  52.  
  53. fragmentList = new ArrayList<Fragment>();
  54. fragmentList.add(mfragment1);
  55. fragmentList.add(mfragment2);
  56. fragmentList.add(mfragment3);
  57.  
  58. titleList.add("第一页 ");
  59. titleList.add("第二页");
  60. titleList.add("第三页 ");
  61.  
  62. m_vp.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager()));
  63. }
  64.  
  65. public class MyViewPagerAdapter extends FragmentPagerAdapter{
  66. public MyViewPagerAdapter(FragmentManager fm) {
  67. super(fm);
  68. // TODO Auto-generated constructor stub
  69. }
  70.  
  71. @Override
  72. public Fragment getItem(int arg0) {
  73. return fragmentList.get(arg0);
  74. }
  75.  
  76. @Override
  77. public int getCount() {
  78. return fragmentList.size();
  79. }
  80.  
  81. @Override
  82. public CharSequence getPageTitle(int position) {
  83. // TODO Auto-generated method stub
  84. return titleList.get(position);
  85. }
  86.  
  87. }
  88.  
  89. }

看到Viewpager跟ListView一样,都需要设置一个Adapter,上面代码是继承了FragmentPagerAdapter,在里面重写了3个方法.往这个Viewpager中添加了要显示的3个页面fragment和对应的3个标题

接着看fragment1.java

  1. package huahua.viewpager;
  2.  
  3. import android.os.Bundle;
  4. import android.support.v4.app.Fragment;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.Button;
  10. import android.widget.TextView;
  11.  
  12. public class fragment1 extends Fragment{
  13. private View mMainView;
  14. private TextView tv;
  15. private Button btn;
  16. @Override
  17. public void onCreate(Bundle savedInstanceState) {
  18. // TODO Auto-generated method stub
  19. super.onCreate(savedInstanceState);
  20. Log.v("huahua", "fragment1-->onCreate()");
  21.  
  22. LayoutInflater inflater = getActivity().getLayoutInflater();
  23. mMainView = inflater.inflate(R.layout.fragment1, (ViewGroup)getActivity().findViewById(R.id.viewpager), false);
  24.  
  25. tv = (TextView)mMainView.findViewById(R.id.tv1);
  26. btn = (Button)mMainView.findViewById(R.id.btn1);
  27. btn.setOnClickListener(new View.OnClickListener() {
  28.  
  29. @Override
  30. public void onClick(View v) {
  31. tv.setText("Hello Viewpager\"");
  32. }
  33. });
  34.  
  35. }
  36.  
  37. @Override
  38. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  39. Bundle savedInstanceState) {
  40. Log.v("huahua", "fragment1-->onCreateView()");
  41.  
  42. ViewGroup p = (ViewGroup) mMainView.getParent();
  43. if (p != null) {
  44. p.removeAllViewsInLayout();
  45. Log.v("huahua", "fragment1-->移除已存在的View");
  46. }
  47.  
  48. return mMainView;
  49. }
  50.  
  51. @Override
  52. public void onDestroy() {
  53. // TODO Auto-generated method stub
  54. super.onDestroy();
  55. Log.v("huahua", "fragment1-->onDestroy()");
  56. }
  57.  
  58. @Override
  59. public void onPause() {
  60. // TODO Auto-generated method stub
  61. super.onPause();
  62. Log.v("huahua", "fragment1-->onPause()");
  63. }
  64.  
  65. @Override
  66. public void onResume() {
  67. // TODO Auto-generated method stub
  68. super.onResume();
  69. Log.v("huahua", "fragment1-->onResume()");
  70. }
  71.  
  72. @Override
  73. public void onStart() {
  74. // TODO Auto-generated method stub
  75. super.onStart();
  76. Log.v("huahua", "fragment1-->onStart()");
  77. }
  78.  
  79. @Override
  80. public void onStop() {
  81. // TODO Auto-generated method stub
  82. super.onStop();
  83. Log.v("huahua", "fragment1-->onStop()");
  84. }
  85.  
  86. }

可以看到Fragment中有个onCreateView方法,返回的是这个fragment的视图View,其他的生命周期方法都跟Activity一样,还要注意的是在回复View前一定要加入代码

  1. ViewGroup p = (ViewGroup) mMainView.getParent();
  2. if (p != null) {
  3. p.removeAllViewsInLayout();
  4. Log.v("huahua", "fragment1-->移除已存在的View");
  5. }

不然在第二次加载onCreateView方法时会报异常:java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent
first.

其他的2个Fragment跟这个类似,代码不贴了,直接运行程序看看效果

效果图第一个页面显示出来,有个标题栏和下面的Fragment页面,主要看看在Viewpager中Fragment的生命周期是怎样的

上图中可以看到除了运行fragment1中的生命周期方法,fragment2的也运行了,然后我们向右滑动到fragment2界面看看

可以看到fragment3页面还没显示出来,其生命周期的方法就已经跑完了,再滑到fragment3

可以看到fragment3页面显示出来,这时fragment1才onPause和onStop

由此我们可以知道在Viewpager中每次显示出来一个页面Fragment时,都会把旁边的一个页面也预加载了,当然你可以控制预加载的页面的数量,

通过setOffscreenPageLimit(int pagenum)来设置,默认情况下参数是1

比如m_vp.setOffscreenPageLimit(2)是否会预加载2个页面

m_vp.setOffscreenPageLimit(0)是否会不预加载页面

看看生命周期是怎么样的

当然Viewpager和Fragment还有很多其他很有用的方法,有兴趣的朋友可以试试.

源码下载地址

转载自:http://www.xuebuyuan.com/1700095.html

ViewPager+Fragment基本使用方法(附源码)的更多相关文章

  1. 转:ViewPager+Fragment基本使用方法(附源码)

    ViewPager+Fragment可以做出多页面滑动效果,让我们的应用程序界面操作起来更加灵活 对于ViewPager和Fragment组件还不熟悉的朋友,可以先看看相关的资料 首先在activit ...

  2. thymeleaf模板引擎调用java类中的方法(附源码)

    前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...

  3. .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]

    经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com ...

  4. 读取xml文件转成List<T>对象的两种方法(附源码)

    读取xml文件转成List<T>对象的两种方法(附源码) 读取xml文件,是项目中经常要用到的,所以就总结一下,最近项目中用到的读取xml文件并且转成List<T>对象的方法, ...

  5. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  6. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

  7. 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)

    在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...

  8. jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)

    上一篇记录了BaiduTemplate模板引擎使用示例附源码,在此基础上对使用方法进行了封装 自定义插件jajaxrefresh.js 代码如下: //闭包限定命名空间 (function ($) { ...

  9. 精选9个值得学习的 HTML5 效果【附源码】

    这里精选了一组很酷的 HTML5 效果.HTML5 是现 Web 开发领域的热点, 拥有很多让人期待已久的新特性,特别是在移动端,Web 开发人员可以借助 HTML5 强大功能轻松制作各种交互性强.效 ...

随机推荐

  1. QBXT Day 4 数学,数论

    今天讲一讲数论吧(虽然清明讲过了) 进制转换 我们来看10这个数怎么转换成k进制 因为10=2^3+2^1,所以10就是1010 三进制也同理10=3^2+3^0,所以就是101 我们对于一个10进制 ...

  2. 利用CocoaLumberjack框架+XcodeColors插件,调试输出有彩色的信息

    效果如下: 步骤: 1. 安装Xcode插件:XcodeColors(方法请参考这里) 2. 为项目添加 CocoaLumberjack 框架(方法请参考这里) 3. 添加代码 (1) 为项目添加 p ...

  3. 安装Nodejs、npm、Less(支持生成压缩后的css)

    安装Nodejs和npm 1.到https://nodejs.org/en/下载最新的版本,安装到d盘下,假设安装后的路径为D:\Program Files\nodejs, 笔者当前的版本v6.10. ...

  4. SQL Compare

    http://pan.baidu.com/s/1jGIEEm6 来源:数据库同步工具: Red Gate Sql Compare

  5. MAMP软件的安装和使用

    MAMP Pro软件是一款很好的在MAC下面运行的网站集成环境软件,功能强大,配置简单,十分便于本地调试,其由Apache+MySQL+PHP+动态DNS配置构成,PHP的版本可以动态切换到最新版.无 ...

  6. PHP封装返回Ajax字符串和JSON数组

    <?php class DBDA { public $host="localhost"; public $uid = "root"; public $pw ...

  7. Leetcode 974. Subarray Sums Divisible by K

    前缀和(prefix sum/cumulative sum)的应用. 还用了一个知识点: a≡b(mod d) 则 a-b被d整除. 即:a与b对d同余,则a-b被d整除. class Solutio ...

  8. 3.4 常用的两种 layer 层 3.7 字体与文本

    3.4 常用的两种 layer 层  //在cocos2d-x中,经常使用到的两种 layer 层 : CCLayer 和 CCLayerColor //CCLayer 的创建 CCLayer* la ...

  9. Linux下系统监控工具nmon使用

    Mongodb安装在Centos7或以上的版本,对于系统的监控方法如下: 1.从\\10.10.10.1\ShareDoc\User\Zchen\linux系统监控下下载2个工具 nmon16e_mp ...

  10. 基于Python语言使用RabbitMQ消息队列(二)

    工作队列 在第一节我们写了程序来向命名队列发送和接收消息 .在本节我们会创建一个工作队列(Work Queue)用来在多个工人(worker)中分发时间消耗型任务(time-consuming tas ...