Android基礎——Activity生命週期

1.ViewPager事件

ViewPager通常和Fragment配合一起使用,能夠使用適當的方式去管理每一頁的生命週期,並使用PagerAdapter去生成每一頁顯示的view數據,向左向右可以滑出每頁視圖。

[java] view plaincopy
  1. OnPageChangeListener{  
  2.     /** 
  3.      * This method will be invoked when the current page is scrolled, either as 
  4.      * part of a programmatically initiated smooth scroll or a user initiated 
  5.      * touch scroll. 
  6.      *  
  7.      * @param position 
  8.      *            Position index of the first page currently being displayed. 
  9.      *            Page position+1 will be visible if positionOffset is nonzero. 
  10.      * @param positionOffset 
  11.      *            Value from [0, 1) indicating the offset from the page at 
  12.      *            position. 
  13.      * @param positionOffsetPixels 
  14.      *            Value in pixels indicating the offset from position. 
  15.      */  
  16.     public void onPageScrolled(int position, float positionOffset,  
  17.             int positionOffsetPixels) {  
  18.     }  
  19.   
  20.     /** 
  21.      * This method will be invoked when a new page becomes selected. Animation 
  22.      * is not necessarily complete. 
  23.      *  
  24.      * @param position 
  25.      *            Position index of the new selected page. 
  26.      */  
  27.     // 一個新頁被調用時執行,仍爲原來的page時,該方法不被調用  
  28.     public void onPageSelected(int position) {  
  29.         for (int i = 0; i < imageViews.length; i++) {  
  30.             imageViews[position]  
  31.                     .setBackgroundResource(R.drawable.guide_dot_green);  
  32.             if (position != i) {  
  33.                 imageViews[i]  
  34.                         .setBackgroundResource(R.drawable.guide_dot_normal);  
  35.             }  
  36.         }  
  37.     }  
  38.   
  39.     /** 
  40.      * Called when the scroll state changes. Useful for discovering when the 
  41.      * user begins dragging, when the pager is automatically settling to the 
  42.      * current page, or when it is fully stopped/idle. 
  43.      *  
  44.      * @param state 
  45.      *            The new scroll state. 
  46.      * @see ViewPager#SCROLL_STATE_IDLE 
  47.      * @see ViewPager#SCROLL_STATE_DRAGGING 
  48.      * @see ViewPager#SCROLL_STATE_SETTLING 
  49.      */  
  50.     /* 
  51.      * SCROLL_STATE_IDLE: pager處於空閒狀態  
  52.      * SCROLL_STATE_DRAGGING: pager處於正在拖拽中 
  53.      * SCROLL_STATE_SETTLING: pager正在自動沉降,相當於鬆手後,pager恢復到一個完整pager的過程 
  54.      */  
  55.     public void onPageScrollStateChanged(int state) {  
  56.         // System.out.println("state:" + state);  
  57.   
  58.     }  
  59.     /* 
  60.      * { private void setScrollState(int newState) { // ... 
  61.      * if(mOnPageChangeListener != null) { 
  62.      * mOnPageChangeListener.onPageScrollStateChanged(newState);//調用 } } 
  63.      */  
  64. }  

2.PagerAdapter

[java] view plaincopy
  1. //PagerAdapter是object的子類  
  2. class MyAdapter extends PagerAdapter {  
  3.   
  4.     /** 
  5.      * PagerAdapter管理數據大小 
  6.      */  
  7.     @Override  
  8.     public int getCount() {  
  9.         return views.size();  
  10.     }  
  11.   
  12.     /** 
  13.      * 關聯key 與 obj是否相等,即是否爲同一個對象 
  14.      */  
  15.     @Override  
  16.     public boolean isViewFromObject(View view, Object obj) {  
  17.         return view == obj; // key  
  18.     }  
  19.   
  20.     /** 
  21.      * 銷燬當前page的相隔2個及2個以上的item時調用 
  22.      */  
  23.     @Override  
  24.     public void destroyItem(ViewGroup container, int position, Object object) {  
  25.         container.removeView((View) object); // 將view 類型 的object熊容器中移除,根據key  
  26.     }  
  27.   
  28.     /** 
  29.      * 當前的page的前一頁和後一頁也會被調用,如果還沒有調用或者已經調用了destroyItem 
  30.      */  
  31.     @Override  
  32.     public Object instantiateItem(ViewGroup container, int position) {  
  33.         container.addView(views.get(position));  
  34.         return views.get(position); // 返回該view對象,作爲key  
  35.     }  
  36. }  

3.FragmentPagerAdapter

用戶訪問的每頁數據都保存在內存中,因此適合訪問頁數不是很多的情況!使用至需要複寫getItem(int) and getCount()方法,如果頁數很多可以使用FragmentStatePagerAdapter,通過bundle保存每頁的狀態信息,因而佔用內存就很小。

                        

[java] view plaincopy
  1. public class MainActivity extends FragmentActivity implements TabListener,  
  2.         OnPageChangeListener {  
  3.   
  4.     private ActionBar actionBar;  
  5.     private final static int TYPE_YULE = 0;  
  6.     private final static int TYPE_NEWS = 1;  
  7.     private final static int TYPE_SPORT = 2;  
  8.   
  9.     private static List<Fragment> fragments;  
  10.     private ViewPager viewPager;  
  11.   
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.activity_main);  
  16.         viewPager = (ViewPager) findViewById(R.id.container);  
  17.         actionBar = getActionBar();  
  18.         fragments = new ArrayList<Fragment>();  
  19.         fragments.add(new YuleFragment());  
  20.         fragments.add(new NewsFragment());  
  21.         fragments.add(new SportFragment());  
  22.   
  23.         // actionBar.setBackgroundDrawable(getResources().getDrawable(R.drawable.appmgr_btn_upgrade_selected));  
  24.         actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
  25.         actionBar.addTab(actionBar.newTab().setText("娛樂").setTag(TYPE_YULE)  
  26.                 .setTabListener(this));  
  27.         actionBar.addTab(actionBar.newTab().setText("新聞").setTag(TYPE_NEWS)  
  28.                 .setTabListener(this));  
  29.         actionBar.addTab(actionBar.newTab().setText("體育").setTag(TYPE_SPORT)  
  30.                 .setTabListener(this));  
  31.   
  32.         viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));  
  33.         viewPager.setOnPageChangeListener(this);  
  34.   
  35.     }  
  36.   
  37.     private static class MyAdapter extends FragmentPagerAdapter {// static  
  38.   
  39.         public MyAdapter(FragmentManager fm) {  
  40.             super(fm);  
  41.         }  
  42.   
  43.         @Override  
  44.         public Fragment getItem(int position) {  
  45.             return fragments.get(position);  
  46.         }  
  47.   
  48.         @Override  
  49.         public int getCount() {  
  50.             return fragments.size();  
  51.         }  
  52.     }  
  53.   
  54.     @Override  
  55.     public void onTabSelected(Tab tab, FragmentTransaction ft) {  
  56.         int tag = Integer.parseInt(tab.getTag().toString());  
  57.         //設置當前的viewpager的當前viewItem  
  58.         viewPager.setCurrentItem(tag);  
  59.     }  
  60.   
  61.     @Override  
  62.     public void onPageSelected(int position) {  
  63.         //滑動時設置actionbar的當前tab  
  64.         actionBar.setSelectedNavigationItem(position);  
  65.     }  
  66.   
  67.     @Override  
  68.     public void onPageScrollStateChanged(int state) {  
  69.     }  
  70.   
  71.     @Override  
  72.     public void onTabUnselected(Tab tab, FragmentTransaction ft) {  
  73.     }  
  74.   
  75.     @Override  
  76.     public void onTabReselected(Tab tab, FragmentTransaction ft) {  
  77.     }  
  78.   
  79.     @Override  
  80.     public void onPageScrolled(int position, float positionOffset,  
  81.             int positionOffsetPixels) {  
  82.     }  
  83. }  

4.FragmentStatePagerAdapter

當有大量頁數時,使用該類型的適配器很合適,類似於listview,當頁面不在可見,fragment對象有可能銷燬,但是,這些fragment的狀態信息被保存下來,類似於activity的狀態保存,從而佔用很少的內存。用法與FragmentPagerAdapter 類似

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章