在一個FragmentTransaction中進行多個操作時的注意事項
阿新 • • 發佈:2019-01-23
在一個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就會為空。