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 类似

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