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

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工作流程如下:


Fragment工作流程.png

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生命周期,重新绘制首页界面,重新加载数据,针对这种情况,我们应该如何处理呢?下一节就来看下具体的解决方案

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容