首页 > 代码库 > fragment中remvoeFragment 和 detachFragment 的区别
fragment中remvoeFragment 和 detachFragment 的区别
一, remvoeFragment 和 detachFragment 的区别:
public void removeFragment(Fragment fragment, int transition, int transitionStyle) { if (DEBUG) Log.v(TAG, "remove: " + fragment + " nesting=" + fragment.mBackStackNesting); final boolean inactive = !fragment.isInBackStack(); if (!fragment.mDetached || inactive) { if (mAdded != null) { mAdded.remove(fragment); } if (fragment.mHasMenu && fragment.mMenuVisible) { mNeedMenuInvalidate = true; } fragment.mAdded = false; fragment.mRemoving = true; moveToState(fragment, inactive ? Fragment.INITIALIZING : Fragment.CREATED, transition, transitionStyle, false); } }
对于没有加到回退栈的fragment, removeFrament 会把该fragment 移到 INITIALIZING 状态 , 查看 moveToState 方法可以知道,该fragment 会被makeInactive,从mAdded 和 mActive 列表移除, 并最终执行onDestroy 、onDetach生命周期方法。ps:在addFragment方法中执行了makeActive
public void detachFragment(Fragment fragment, int transition, int transitionStyle) { if (DEBUG) Log.v(TAG, "detach: " + fragment); if (!fragment.mDetached) { fragment.mDetached = true; if (fragment.mAdded) { // We are not already in back stack, so need to remove the fragment. if (mAdded != null) { if (DEBUG) Log.v(TAG, "remove from detach: " + fragment); mAdded.remove(fragment); } if (fragment.mHasMenu && fragment.mMenuVisible) { mNeedMenuInvalidate = true; } fragment.mAdded = false; moveToState(fragment, Fragment.CREATED, transition, transitionStyle, false); } } }
detachFragment 会把fragment 从当前状态(可能是Resumed)移动到 CREATED 状态, fragment不会从mActive 列表移除, 生命周期方法执行到 onDestroyView。
attachFragment 会把之前detach的fragment重新加入mAdded列表,并执行 moveToState(.. mCurState ..) , 这里的mCurState 是fragmentManager从 Activity同步过来的状态。
总结: addFragment 和 removeFragment 执行的更彻底,是从 无-有-无 的过程 , 而detachFragment和attachFragment只是改变了fragment的状态,fragment对象不会被释放掉,比如一个fragment当前是resumed状态(当然它所在的activity也是resumed状态), 是可见的,我们对这个fragment执行detach操作,那么它会从UI中消失,然后执行attach操作,它的状态还可以恢复到resumed, 又回到视野中。
二,执行的过程也有不同:
先 addFragment 才能 removeFragment;
先 detachFragment 才能 attachFragment。
fragment中remvoeFragment 和 detachFragment 的区别