1. 程式人生 > >在一個FragmentTransaction中進行多個操作時的注意事項

在一個FragmentTransaction中進行多個操作時的注意事項

在一個FragmentTransaction中進行多個操作時要注意一些事情:
比如在一個FragmentTransaction中先後執行以下操作:
1. add一個Fragment
2. hide這個Fragment
3. show這個Fragment

如果我們在fragment的onHiddenChanged中做一些事情的話,我們會發現getActivity是為空的,為什麼?請看以下程式碼:
/Users/lihuaping/Library/Android/sdk/sources/android-22/android/support/v4/app/BackStackRecord.java

Op op = mHead;
        while
(op != null) { int enterAnim = state != null ? 0 : op.enterAnim; int exitAnim = state != null ? 0 : op.exitAnim; switch (op.cmd) { case OP_ADD: { Fragment f = op.fragment; f.mNextAnim = enterAnim; mManager.addFragment(f, false
); } break; case OP_REPLACE: { xxxxxxxx } break; case OP_REMOVE: { xxxxxxxx } break; case OP_HIDE: { Fragment f = op.fragment; f.mNextAnim = exitAnim; mManager.hideFragment(f, transition, transitionStyle); } break
; case OP_SHOW: { Fragment f = op.fragment; f.mNextAnim = enterAnim; mManager.showFragment(f, transition, transitionStyle); } break; case OP_DETACH: { xxxxxxxx } break; case OP_ATTACH: { xxxxxxxx } break; default: { throw new IllegalArgumentException("Unknown cmd: " + op.cmd); } } op = op.next; } mManager.moveToState(mManager.mCurState, transition, transitionStyle, true);

我們可以看到這個迴圈是把BackStackRecord中的每一個Op從前往後依次執行的,mManager.addFragment(f, false);的第二個引數為false,表示不要馬上執行moveToState,那麼什麼時候執行moveToState呢?在所有的Op執行了之後,也就是最後一行程式碼。而在moveToState執行之前,Fragment的生命週期方法是沒有被回撥的,所以在onHiddenChanged中getActivity就會為空。