快速讀懂 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)

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