1. Fragment源码分析
1>:add(int contianerId,Fragment):这个方法其实只是设置了一些参数,其余什么都没做,所以系统才要求我们 必须 调用 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中,会调用 add(R.id.container , homeFragment)方法;
B:然后会执行 FragmentManager 中的 moveToState() 方法,这个 moveToState() 方法会调用 Fragment 的生命周期,如 onAttach、onCreate、onCreateView,当调用 onCreateView方法的时候,就会调用 HomeFragment 中已经复写的 onCreateView,然后返回一个 首页的 View;
C:当返回 首页的View时,就会调用 container.addView(),就会把 这个 View添加到 MainActivity中的 布局容器中;
3>:replace()方法是怎么执行的?
A:首先执行 removeFragment()方法,会把上一个 Fragment 移除:
mManager.removeFragment(old, transition, transitionStyle);
B:然后调用 addFragment() 方法,会把新的 Fragment 添加到 容器中:
mManager.addFragment(f, false);
replace()源码就是:把之前的Fragment移除,重新执行Fragment生命周期,重新绘制界面;
也就是说:当点击 首页的 HomeFragment时候会把首页HomeFragment加载进来,点击第二个发现 的 FindFragment时候会把首页的移除然后加载新的FindFfragment,当点击 消息的 MessageFragment时候会把 发现的FindFragment移除,当点击 我的 MyFragmgnet时候会把 消息的MessageFragment移除,然后点击首页时候会重新执行 Fragment生命周期,重新绘制首页界面,重新加载数据,针对这种情况,我们应该如何处理呢?下一节就来看下具体的解决方案