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工作流程如下:
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é)就來看下具體的解決方案