如下內容爲原創,轉載請註明:html
來自每天博客:http://www.cnblogs.com/tiantianbyconan/p/4303910.html 微信
參考微信,使用ViewPager來顯示不一樣的tab,每一個tab是一個Fragment,ide
假設有3個tab,對應的fragment是FragmentA、FragmentB、FragmentCspa
須要實現的效果是進入後,默認先只加載FragmentA,具體滑動到了哪一個Fragment,再去加載該Fragment的數據。code
能夠參考以下BaseLazyFragment代碼:htm
1 /** 2 * Author: wangjie 3 * Email: tiantian.china.2@gmail.com 4 * Date: 1/23/15. 5 */ 6 public class BaseLazyFragment extends BaseFragment { 7 private static final String TAG = BaseLazyFragment.class.getSimpleName(); 8 private boolean isPrepared; 9 10 @Override 11 public void onActivityCreated(Bundle savedInstanceState) { 12 super.onActivityCreated(savedInstanceState); 13 initPrepare(); 14 } 15 16 17 /** 18 * 第一次onResume中的調用onUserVisible避免操做與onFirstUserVisible操做重複 19 */ 20 private boolean isFirstResume = true; 21 22 @Override 23 public void onResume() { 24 super.onResume(); 25 if (isFirstResume) { 26 isFirstResume = false; 27 return; 28 } 29 if (getUserVisibleHint()) { 30 onUserVisible(); 31 } 32 } 33 34 @Override 35 public void onPause() { 36 super.onPause(); 37 if (getUserVisibleHint()) { 38 onUserInvisible(); 39 } 40 } 41 42 private boolean isFirstVisible = true; 43 private boolean isFirstInvisible = true; 44 45 @Override 46 public void setUserVisibleHint(boolean isVisibleToUser) { 47 super.setUserVisibleHint(isVisibleToUser); 48 if (isVisibleToUser) { 49 if (isFirstVisible) { 50 isFirstVisible = false; 51 initPrepare(); 52 } else { 53 onUserVisible(); 54 } 55 } else { 56 if (isFirstInvisible) { 57 isFirstInvisible = false; 58 onFirstUserInvisible(); 59 } else { 60 onUserInvisible(); 61 } 62 } 63 } 64 65 public synchronized void initPrepare() { 66 if (isPrepared) { 67 onFirstUserVisible(); 68 } else { 69 isPrepared = true; 70 } 71 } 72 73 /** 74 * 第一次fragment可見(進行初始化工做) 75 */ 76 public void onFirstUserVisible() { 77 78 } 79 80 /** 81 * fragment可見(切換回來或者onResume) 82 */ 83 public void onUserVisible() { 84 85 } 86 87 /** 88 * 第一次fragment不可見(不建議在此處理事件) 89 */ 90 public void onFirstUserInvisible() { 91 92 } 93 94 /** 95 * fragment不可見(切換掉或者onPause) 96 */ 97 public void onUserInvisible() { 98 99 } 100 101 }
如上代碼,使用setUserVisibleHint方法做爲回調的依據,blog
暴露出來讓子類使用的新的生命週期方法爲:生命週期
- onFirstUserVisible();事件
第一次fragment可見(進行初始化工做)get
- onUserVisible();
fragment可見(切換回來或者onResume)
- onFirstUserInvisible();
第一次fragment不可見(不建議在此處理事件)
- onUserInvisible();
fragment不可見(切換掉或者onPause)
具體的效果是:
1. 首先加載ViewPager,回調FragmentA(第一個默認呈現的Fragment)的onFirstUserVisible(),能夠在這裏進行FragmentA的初始化工做,其餘Fragment保持不變。
2. 用戶從FragmentA滑動到FragmentB,回調FragmentA的onUserInvisible()、FragmentB的onFirstUserVisible()(由於第一次切換到FragmentB,能夠在這裏進行初始化工做)。
3. 用戶從FragmentB滑動到FragmentC,回調FragmentB的onUserInvisible()、FragmentC的onFirstUserVisible()(由於第一次切換到FragmentC,能夠在這裏進行初始化工做)。
4. 用戶從FragmentC滑動到FragmentB,回調FragmentC的onUserInvisible()、FragmentB的onUserVisible()(由於FragmentB以前已經被加載過)。
5. 由於到此爲止,suoyou的Fragment都已經被加載過了,因此之後這3個Fragment互相任意切換,只會回調原來Fragment的onUserInvisible()和切換後的Fragment的onUserVisible()。
6. 用戶處於FragmentB,關閉手機屏幕,回調FragmentB的onUserInvisible()。
7. 用戶處於FragmentB,手機屏幕處關閉狀態,而後開啓手機屏幕解鎖,只回調FragmentB的onUserVisible()。