Android App中使用ViewPager+Fragment實現滑動轉場效果_Android

來源:互聯網
上載者:User

在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:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.