当前位置: 移动技术网 > 移动技术>移动开发>Android > Android App中使用ViewPager+Fragment实现滑动切换效果

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

在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  - 全部存在,所以不太适合加载 大量的数据 如图片什么的,很容易内存溢出。

工程结构:

2016323111010106.jpg (321×250)

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:

2016323111113586.jpg (630×136)

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网