Android App中使用ViewPager+Fragment实现滑动切换效果

在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar、细节无法控制。不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包。那我们就也采用viewpager来做滑动吧。另外一个概念就是Fragment和FragmentActivity,Fragment是一个特殊的类,有着和activity一致的生命周期和view一致的界面,也就是Fragment就等于具有生命周期的View,但是,要注意的是:Fragment并不是View,它和View没有继承关系。使用Fragment的好处是:Fragment可以重用,而且每个Fragment可以在内部处理自己的业务就像activity一样,这样模块间耦合较低,比把所有的业务都写在一个activity内部逻辑要清晰很多。还有就是,由于每个模块的业务都在Fragment内部来实现,这样activity只要管理好几个Fragment就行了,不需要做和业务相关的事情,最后,Fragment可以用来做不同分辨率机型的适配。Fragment在sdk(android 3.0及更高)和android-support-v4里面都有,但是由于兼容性的问题,我们只能使用android-support-v4里面的Fragment,除非你想你的apk只跑在3.0以后的android手机上,FragmentActivity的情况和Fragment类似。关于Fragment和FragmentActivity,其实有一些基本的用法需要了解一下,但是考虑到Fragment不是本文的重点,所以这里就不介绍了,另外,本文只用Fragment做了一个简单的界面,大家应该一看就懂,好了,言归正传。

ViewPager + Fragment 经常用到  代码是从   actionbarsherlock 中提取出来的,这个效果都知道是 滑动来切换的。直接上代码了
在这里简单说明一下 FragmentStatePagerAdapter 和 FragmentPagerAdapter
2个adapter:
第一种 fragment状态adapter -  在当前只会存在   前1个fragment  当前 fragment 和 下1个 fragment   其他销毁 ,适合加载多数据;
第二种 FragmentPagerAdapter  - 全部存在,所以不太适合加载 大量的数据 如图片什么的,很容易内存溢出。

工程结构:

1.activity adapter 在一起 (static类型的 Fragment)

public class ViewPageFragment extends FragmentActivity { 

  //这个是有多少个 fragment页面
  static final int NUM_ITEMS = 5;
  private MyAdapter  mAdapter;
  private ViewPager  mPager;
  private int nowPage; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pagers_fragment_main);
    mAdapter = new MyAdapter(getSupportFragmentManager() );
    mPager = (ViewPager)findViewById(R.id.mypagers_pager);
    mPager.setAdapter(mAdapter);
  } 

  /**
   * 有状态的 ,只会有前3个存在 其他销毁, 前1个, 中间, 下一个
   */
  public static class MyAdapter extends  FragmentStatePagerAdapter {
    public MyAdapter(FragmentManager fm) {
      super(fm);
    } 

    @Override
    public int getCount() {
      return NUM_ITEMS;
    } 

    //得到每个item
    @Override
    public Fragment getItem(int position) {
      return ArrayFragment.newInstance(position);
    } 

    // 初始化每个页卡选项
    @Override
    public Object instantiateItem(ViewGroup arg0, int arg1) {
      // TODO Auto-generated method stub
      return super.instantiateItem(arg0, arg1);
    } 

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
      System.out.println( "position Destory" + position);
      super.destroyItem(container, position, object);
    } 

  } 

  /**
   * 无状态的 会全部加载着, 这个适合少量的 特别多的图片啊啥的 还是用 FragmentStatePagerAdapter
   * @author lilei
   */
//  public static class MyAdapter extends FragmentPagerAdapter {
//   public MyAdapter(FragmentManager fm ) {
//      super(fm);
//
//    }
//
//    @Override
//    public int getCount() {
//      return NUM_ITEMS;
//    }
//
//    @Override
//    public Fragment getItem(int position) {
//     // 返回相应的 fragment
//      return ArrayFragment.newInstance(position);
//    }
//
//    @Override
//    public void destroyItem(ViewGroup container, int position, Object object) {
//     System.out.println( "position Destory" + position);
//     super.destroyItem(container, position, object);
//    }
//  } 

  /**
   * 所有的 每个Fragment
   */
  public static class ArrayFragment extends Fragment { 

    int mNum;
    static ArrayFragment newInstance(int num) {
      ArrayFragment array= new ArrayFragment();
      Bundle args = new Bundle();
      args.putInt("num", num);
      array.setArguments(args);
      return array;
    } 

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      mNum = getArguments() != null ? getArguments().getInt("num") : 1;
      System.out.println("mNum Fragment create ="+ mNum);
    } 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
       System.out.println("onCreateView = ");
       //在这里加载每个 fragment的显示的 View
       View v = null; 

       if(mNum == 0){
         v = inflater.inflate(R.layout.pagers_fragment1, container, false);
         ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
       }else if(mNum == 1){
         v = inflater.inflate(R.layout.pagers_fragment1, container, false);
         ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
       }else if(mNum == 2){
         v = inflater.inflate(R.layout.pagers_fragment1, container, false);
         ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
       }else{
         v = inflater.inflate(R.layout.pagers_fragment1, container, false);
         ((TextView)v.findViewById(R.id.textView1)).setText(mNum+ "= mNum");
       }
      return v;
    } 

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
      System.out.println("onActivityCreated = ");
      super.onActivityCreated(savedInstanceState);
    } 

    @Override
    public void onDestroyView(){
      System.out.println(mNum + "mNumDestory");
      super.onDestroyView();
    } 

    @Override
    public void onDestroy(){
      super.onDestroy();
    } 

  }
}

2. 和 1也没什么太大区别( 个中用处 看个人了 )

public class ViewPageFragmentCS extends FragmentActivity { 

  //这个是有多少个 fragment页面
  private MyAdapter  mAdapter;
  private ViewPager  mPager;
  private List<Entity> list = new ArrayList<ViewPageFragmentCS.Entity>();; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.pagers_fragment_main); 

    for (int i = 0; i < 7 ; i++) {
      Entity ee = new Entity();
      ee.name = "ll"+ i;
      ee.age = ""+ i;
      list.add(ee);
    }
    mAdapter = new MyAdapter(getSupportFragmentManager(),list);
    mPager = (ViewPager)findViewById(R.id.mypagers_pager);
    mPager.setAdapter(mAdapter);
  } 

  private class Entity{
    public String name;
    public String age;
  } 

  // 在这里你可以传 list<Fragment> 也可以传递 list<Object>数据
  public class MyAdapter extends FragmentStatePagerAdapter {
    List<Entity> list_ee; 

    public MyAdapter(FragmentManager fm, List<Entity> ee) {
      super(fm);
      this.list_ee = ee ;
    } 

    @Override
    public int getCount() {
      return list_ee.size();
    } 

    // 初始化每个页卡选项
    @Override
    public Object instantiateItem(ViewGroup arg0, int position) { 

      ArrayFragment ff = (ArrayFragment)super.instantiateItem(arg0, position);
      ff.setThings(list_ee.get(position),position);
      return ff;
    } 

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
      System.out.println( "position Destory" + position);
      super.destroyItem(container, position, object);
    } 

    @Override
    public Fragment getItem(int arg0) {
      // TODO Auto-generated method stub
      return new ArrayFragment();
    } 

  } 

  /**
   * 所有的 每个Fragment
   */
  public class ArrayFragment extends Fragment {
    private Entity ee;
    private int position; 

    public void setThings(Entity ee,int position){
      this.ee =ee ;
      this.position = position;
    } 

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
    } 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
       System.out.println("onCreateView = ");
       //在这里加载每个 fragment的显示的 View
       View v = inflater.inflate(R.layout.pagers_fragment1, container, false);
      ((TextView)v.findViewById(R.id.textView1)).setText(ee.name+ "= ee.Name -=age"+ ee.age);
      return v;
    } 

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
      System.out.println("onActivityCreated = ");
      super.onActivityCreated(savedInstanceState);
    } 

    @Override
    public void onDestroyView(){
      System.out.println("onDestroyView = "+ position);
      super.onDestroyView();
    } 

    @Override
    public void onDestroy(){
      System.out.println("onDestroy = "+ position);
      super.onDestroy();
    }
  }
}

直接复制过去就可以看效果了   别忘记  V4包,xml 布局文件 自己随便整个吧。
滑动到第3个页面的时候可以看到第1个页面销毁第4个生成,当前存在2、3、4:

时间: 2016-03-22

Android实现单页显示3个Item的ViewPager炫酷切换效果

单页显示3个Item的ViewPager炫酷切换效果,适用于Banner等. 效果图 Rotate Y Rotate Down Rotate Up Alpha ScaleIn ScaleIn + Alpha + Rotate Down 使用 ###(1)引入 compile `com.zhy:magic-viewpager:1.0.1` ###(2)示例 布局文件 <FrameLayout android:layout_width="match_parent" android:l

Android中TabLayout结合ViewPager实现页面切换效果

先看看效果,如图: 1.因为TabLayout是Android Design Support Library官方库的一个控件,所以使用TabLayout时候需要先添加对该库的依赖 compile 'com.android.support:design:22.2.0' 2.下面是TabLayout和ViewPager配合使用的布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns

Android开发之使用ViewPager实现图片左右滑动切换效果

Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

Android ViewPager实现选项卡切换

本文实例介绍了ViewPager实现选项卡切换,效果图如下: 步骤一:这里使用兼容低版本的v4包进行布局,这里eclipse没有输入提示,所以要手动输入,文件名称"activity_main.xml" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"

Android应用中使用ViewPager实现类似QQ的界面切换效果

这几天在研究ViewPager,简单的写一下如何使用ViewPager实现类似于QQ的"最近联系人.好友.群组"的界面切换(不知道他们是不是用这个方法实现的). ViewPager已经在android-sdk中加入了,具体的位置在%android_sdk_home%\android-compatibility\v4,%android_sdk_home%是你的android-sdk-windows目录. 好,下面放一张效果图: 步骤一:新建一个工程,我的是Viewpager 步骤二:导入

灵活使用Android中ActionBar和ViewPager切换页面

本文实例讲述了Android使用ActionBar和ViewPager切换页面,分享给大家供大家参考.具体如下: 运行效果截图如下: 项目布局如下: 具体代码如下: MainActivity.java代码 import java.util.ArrayList; import java.util.List; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.

Android实现千变万化的ViewPager切换动画

之前写过一篇文章:Android自定义ViewPager实现个性化的图片切换效果,有朋友提出,ViewPager自带了一个setPageTransformer用于设置切换动画~ 本篇文章,将进行以下内容学习: 1.介绍如何使用setPageTransformer设置切换动画: 2.自定义PageTransformer实现个性的切换动画: 3.该方法在SDK11以下的版本不起作用,我们会对其做一定修改,让其向下兼容. 官方示例地址:http://developer.android.com/trai

Android编程实现ViewPager多页面滑动切换及动画效果的方法

本文实例讲述了Android编程实现ViewPager多页面滑动切换及动画效果的方法.分享给大家供大家参考,具体如下: 一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式, 白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了,接下来我们就来实现它. 二.在开始前,我们先要认识一个控件,ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换. 这个附加包是and

Android应用中利用ViewPager实现多页面滑动切换效果示例

1.添加android support包 因为上面的几个类都是在android support包中才提供,我们先添加包. 在Eclipse->Window->Android SDK Manager,选择列表中Extras->Android Support Library进行安装.下载完后在android-sdk\extras\android\support目录下,这里我们选择v4版本,进入v4目录,拷贝其中的android-support-v4.jar文件到工程的libs目录(若没有新建

Android中ViewPager组件的基本用法及实现图片切换的示例

ViewPager是android-support-v4.jar包里的组件.在布局文件里标签需要连包名一起 写全称<android.support.v4.view.ViewPager /> 基本用法 ViewPager的基本用法我概括为三步 第一步 在主布局文件里放一个ViewPager组件 第二步 为每个页面建立布局文件,把界面写好 第三步 在主Activity里获取ViewPager组件,并为它设定Adapter. Adapter详细讲讲,ViewPager对应的Adapter继承自Pag

实例讲解Android中ViewPager组件的一些进阶使用技巧

我们经常看到使用了ViewPager的App,在每页上面都会有一个滑块来标志当前处于哪一页.在PagerView包里有android.support.v4.view.PagerTitleStrip和android.support.v4.view.PagerTabStrip两个组件,可以在布局文件中,作为ViewPager的子标签,并设定相对与ViewPager的位置(比如顶部).但这两个组件都很丑,并且标题会随着页面一起滑动,所以一般都不用. 其实实现一个滑块标志当前页面也很简单,大概需要两步:

Android编程四大组件之Activity用法实例分析

本文实例讲述了Android编程四大组件之Activity用法.分享给大家供大家参考,具体如下: 这里详细介绍如何创建Activity.生命周期.内存管理.启动模式. 创建Activity 一.定义Activity 1. 定义Activity 定义类继承Activity 2.在AndroidManifest.xml的节点中声明<activity> 显式意图创建Activity三种方式方式 //第一种方式:构造函数,代码少 Intent intent1 =new Intent(this,NewA

Android中WebView的一些简单用法

Android中WebView的一些简单用法 一直想写一个关于 WebView 控件的 一些简单运用,都没什么时间,这次也是挤出时间写的,里面的一些基础知识就等有时间再更新讲解一下,今天就先把项目出来做一些简单介绍,过多的内容可以看我的源码,都传到github上了. 下面是项目的效果图: 应用用到的是 MVP 设计模式,对这种模式还不太了解的可以先自行google一下,不然项目估计会看的晕,虽然我的代码都很简洁的. 对于MVP 可以带着一个思路看源码,那就是 activity(或其他组件)通过

android中图形图像处理之drawable用法分析

本文实例讲述了android中图形图像处理之drawable用法.分享给大家供大家参考.具体如下: 一.如何获取 res 中的资源 数据包package:android.content.res 主要类:Resources 其主要接口按照功能,划分为以下三部分: getXXXX() 例如: int getColor(int id) Drawable getDrawable(int id) String getString(int id)  直接获取res中存放的资源 InputStream ope

Android 中ViewPager中使用WebView的注意事项

Android 中ViewPager中使用WebView的注意事项 前言: 今天在做项目时遇到了一个小问题 首先使用ViewPager显示多个页面,然后在每个页面上使用Fragment显示数据,其中有一部分数据是通过WebView加载的Html标签. 具体xml布局如下 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.andr

Android 中ViewPager重排序与更新实例详解

Android 中ViewPager重排序与更新实例详解 最近的项目中有栏目订阅功能,在更改栏目顺序以后需要更新ViewPager.类似于网易新闻的频道管理. 在重新排序之后调用了PagerAdapter的notifyDataSetChanged方法,发现ViewPager并没有更新,于是我开始跟踪源码,在调用PagerAdapter的notifyDataSetChanged方法后,会触发Viewpager的dataSetChanged方法. void dataSetChanged() { //

Android中AlertDialog各种对话框的用法实例详解

目标效果: 程序运行,显示图一的几个按钮,点击按钮分别显示图二到图六的对话框,点击对话框的某一项或者按钮,也会显示相应的吐司输出. 1.activity_main.xml页面存放五个按钮. activity_main.xml页面: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools&

Android中Split()字符串分割特殊用法案例详解

split()分割字符串 1.不同环境下的区分 Java:分割字符串不能写成split("$")//$为要分割的字符 Android:分割字符串需要加上中括号split("[$]")//$为要分割的字符 2.特殊用法--当split()分割字符串遇上特殊符号 案例分析 String str = "abc|dfg"; String[] all=str.split("|"); system.out.println(all[0]);

Android中Messenger原理及基本用法详解

这边博客主要记录一下Android中Messenger的基本原理和用法. 简单来讲,Messenger其实就是Binder通信的包装器,是一种基于消息传递的进程间通信工具. //Messenger实现了Parcelable接口,因此可以跨进程传输 public final class Messenger implements Parcelable { ............... } 通常情况下,我们可以在A进程中创建一个Messenger,然后将该Messenger传递给B进程. 于是,B进