首頁 >Java >java教程 >Android App中使用ViewPager+Fragment實現滑動切換效果

Android App中使用ViewPager+Fragment實現滑動切換效果

高洛峰
高洛峰原創
2017-01-13 11:44:201461瀏覽

在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 和下1個其他銷毀資料,適合載入中1個資料;
第二種FragmentPagerAdapter  - 全部存在,所以不太適合載入大量的資料如圖片什麼的,很容易記憶體溢位。

工程結構:

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

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();  
    }     
  } 
}

2. 和1也沒什麼太大區別( 個中用處看個人了)
reee看效果了   別忘記  V4包,xml 佈局檔自己隨便整個吧。

滑動到第3頁的時候可以看到第1個頁面銷毀第4個生成,目前存在2、3、4:

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

更多Android App中使用ViewPager+Fragment實現滑動切換效果相關文章請關注PHP中文網!


🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn