在一个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就会为空。