Fragment系列文章(二) - Fragment源碼分析

1. Fragment源碼分析

1>:add(int contianerId,Fragment):這個(gè)方法其實(shí)只是設(shè)置了一些參數(shù),其余什么都沒做,所以系統(tǒng)才要求我們 必須 調(diào)用 commit() 提交;

public FragmentTransaction add(Fragment fragment, String tag) {
        doAddOp(0, fragment, tag, OP_ADD);
        return this;
    }
private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) {
        fragment.mFragmentManager = mManager;

        if (tag != null) {
            if (fragment.mTag != null && !tag.equals(fragment.mTag)) {
                throw new IllegalStateException("Can't change tag of fragment "
                        + fragment + ": was " + fragment.mTag
                        + " now " + tag);
            }
            fragment.mTag = tag;
        }

        if (containerViewId != 0) {
            if (fragment.mFragmentId != 0 && fragment.mFragmentId != containerViewId) {
                throw new IllegalStateException("Can't change container ID of fragment "
                        + fragment + ": was " + fragment.mFragmentId
                        + " now " + containerViewId);
            }
            fragment.mContainerId = fragment.mFragmentId = containerViewId;
        }

        Op op = new Op();
        op.cmd = opcmd;
        op.fragment = fragment;
        addOp(op);
    }

2>:commit()提交方法:
Fragment工作流程如下:


Fragment工作流程.png

A:首先 在MainActivity中,會(huì)調(diào)用 add(R.id.container , homeFragment)方法;
B:然后會(huì)執(zhí)行 FragmentManager 中的 moveToState() 方法,這個(gè) moveToState() 方法會(huì)調(diào)用 Fragment 的生命周期,如 onAttach、onCreate、onCreateView,當(dāng)調(diào)用 onCreateView方法的時(shí)候,就會(huì)調(diào)用 HomeFragment 中已經(jīng)復(fù)寫的 onCreateView,然后返回一個(gè) 首頁(yè)的 View;
C:當(dāng)返回 首頁(yè)的View時(shí),就會(huì)調(diào)用 container.addView(),就會(huì)把 這個(gè) View添加到 MainActivity中的 布局容器中;
3>:replace()方法是怎么執(zhí)行的?
A:首先執(zhí)行 removeFragment()方法,會(huì)把上一個(gè) Fragment 移除:

mManager.removeFragment(old, transition, transitionStyle);

B:然后調(diào)用 addFragment() 方法,會(huì)把新的 Fragment 添加到 容器中:

mManager.addFragment(f, false);

replace()源碼就是:把之前的Fragment移除,重新執(zhí)行Fragment生命周期,重新繪制界面;

也就是說:當(dāng)點(diǎn)擊 首頁(yè)的 HomeFragment時(shí)候會(huì)把首頁(yè)HomeFragment加載進(jìn)來,點(diǎn)擊第二個(gè)發(fā)現(xiàn) 的 FindFragment時(shí)候會(huì)把首頁(yè)的移除然后加載新的FindFfragment,當(dāng)點(diǎn)擊 消息的 MessageFragment時(shí)候會(huì)把 發(fā)現(xiàn)的FindFragment移除,當(dāng)點(diǎn)擊 我的 MyFragmgnet時(shí)候會(huì)把 消息的MessageFragment移除,然后點(diǎn)擊首頁(yè)時(shí)候會(huì)重新執(zhí)行 Fragment生命周期,重新繪制首頁(yè)界面,重新加載數(shù)據(jù),針對(duì)這種情況,我們應(yīng)該如何處理呢?下一節(jié)就來看下具體的解決方案

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容