快速读懂 Fragment 与 Activity 的关系

FragmentActivity

继承自Activity,支持 support.v4 Fragment 的使用,目前已成为 Android 默认Activity

onCreate()中进行关联FragmentController相关。

    protected void onCreate(@Nullable Bundle savedInstanceState) {
        mFragments.attachHost(null /*parent*/);
				/*** 省略不重要源码 ***/
        mFragments.dispatchCreate();
    }

onDestroy()中进行去关联FragmentController相关。

    protected void onDestroy() {
        super.onDestroy();

        doReallyStop(false);

        mFragments.dispatchDestroy();
        mFragments.doLoaderDestroy();
    }

FragmentController

构造方法:

    private FragmentController(FragmentHostCallback<?> callbacks) {
        mHost = callbacks;
    }

作为FragmentActivity的成员变量被初始化。

工厂函数createContoller(FragmentHostCallback)需要传入一个FragmentHostCallback对象,这里直接 new 了一个HostCallbacks,是前者的实现类。

final FragmentController mFragments = FragmentController.createController(new HostCallbacks());

在 Activity#onCreate()中被调用attchHost方法,该方法中实现了 FragmentManager 和 FragmentHostCallback 的关联。

    /**
     * Attaches the host to the FragmentManager for this controller. The host must be
     * attached before the FragmentManager can be used to manage Fragments.
     */
    public void attachHost(Fragment parent) {
        mHost.mFragmentManager.attachController(
                mHost, mHost /*container*/, parent);
    }

FragmentContainer

抽象类,用于管理布局 view。主要实现类为FragmentHostCallback

/**
 * Callbacks to a {@link Fragment}'s container.
 */
public abstract class FragmentContainer {
    /**
     * Return the view with the given resource ID. May return {@code null} if the
     * view is not a child of this container.
     */
    @Nullable
    public abstract View onFindViewById(@IdRes int id);

    /**
     * Return {@code true} if the container holds any view.
     */
    public abstract boolean onHasView();
}

FragmentHostCallback

继承自FragmentContainer,作为FragmentController的成员变量在其构造方法中被赋值,主要实现类为HostCallbacks

    /**
     * Returns a {@link FragmentController}.
     */
    public static final FragmentController createController(FragmentHostCallback<?> callbacks) {
        return new FragmentController(callbacks);
    }

    private FragmentController(FragmentHostCallback<?> callbacks) {
        mHost = callbacks;
    }

FragmentManager

抽象类,作为FragmentHostCallback的成员变量被初始化。主要实现类为FragmentManagerImpl

final FragmentManagerImpl mFragmentManager = new FragmentManagerImpl();

attachController()方法中与FragmentHostCallbackFragmentContainer进行关联。由于 FragmentHostCallback 继承自 FragmentContainer,其实也就是一个对象,只是表现为不同的子类。

    public void attachController(FragmentHostCallback host,
            FragmentContainer container, Fragment parent) {
        if (mHost != null) throw new IllegalStateException("Already attached");
        mHost = host;
        mContainer = container;
        mParent = parent;
    }

FragmentTransaction

抽象类,帮助FragmentManager管理 Fragment 的添加、移除、显示、隐藏等操作。主要实现类为BackStackRecord

这个类应该很熟悉了,在每次执行 Fragment 的相关操作时都需要通过 FragmentManager 来获取该对象最终完成操作。例如:

				val fragment = MyFragment()
                fragmentManager
                        .beginTransaction()
                        .add(rxPermissionsFragment, TAG)
                        .commitNowAllowingStateLoss()

这里的 beginTransaction()每次会重新初始化一个 FragmentTransation 对象:

    public FragmentTransaction beginTransaction() {
        return new BackStackRecord(this);
    }

总结

大致的包含关系如下:
Activity(FragmentActivity) --> FragmentController --> FragmentContainer(FragmentHostCallback(HostCallbacks)) --> FragmentManager --> FragmentTransaction(BackStackRecord)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章