fragment中remvoeFragment 和 detachFragment 的区别

本文详细解析了Android中Fragment的两种状态管理方法:removeFragment与detachFragment的区别。removeFragment将Fragment移除并执行销毁流程,而detachFragment仅改变其可见性状态而不销毁。此外,还介绍了这两种方法的操作顺序限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一, 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。


转载于:https://my.oschina.net/u/255456/blog/337701

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值