BAT大咖助力Android面試2-Fragment面試詳解

二,Fragment面試詳解

1,Fragment爲什麼會被稱爲第五大組件

Fragment有自己的生命週期,但是不能獨立使用,要加載到activity中使用。
優點
(1)fragment相比activity更節省內存。
(2)能動態靈活的加載到Activity中去配合viewpager使用,UI切換更方便舒適。

2,Fragment加載到Activity的兩種方式

(1)靜態加載,fragment作爲標籤加載到activity的佈局文件中

    <fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

(2)動態加載

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    DemoFragment fragment = new DemoFragment();
    fragmentTransaction.add(R.id.content, fragment);//容器資源作爲標誌位,把fragment添加到對應的位置
    fragmentTransaction.addToBackStack("DemoFragment");
    fragmentTransaction.commit();

3,FragmentPagerAdapter與FragmentStatePagerAdapter(源碼分析)

FragmentPagerAdapter適用於頁面較少的情況

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    mCurTransaction.detach((Fragment)object);
}

FragmentStatePagerAdapter適用於頁面較多的情況,每次切換回收內存

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    Fragment fragment = (Fragment) object;

    if (mCurTransaction == null) {
        mCurTransaction = mFragmentManager.beginTransaction();
    }
    if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
            + " v=" + ((Fragment)object).getView());
    while (mSavedState.size() <= position) {
        mSavedState.add(null);
    }
    mSavedState.set(position, fragment.isAdded()
            ? mFragmentManager.saveFragmentInstanceState(fragment) : null);
    mFragments.set(position, null);

    mCurTransaction.remove(fragment);
}

4,Fragment生命週期

這裏寫圖片描述
參考自:https://blog.csdn.net/i_wait_for_you/article/details/70240075
https://www.cnblogs.com/LangZXG/p/6501839.html
https://blog.csdn.net/superjunjin/article/details/44783279

由於Fragment依賴Activity的存在而存在,故在創建時Activity生命週期中的方法均先於Fragment生命週期中的方法執行;相反,在銷燬時,是先執行Fragment生命週期中的方法再執行Activity生命週期中的方法。

5,Fragment通信

在Fragment中調用Activity中的方法 getActivity
在Fragment中調用Fragment中的方法 接口回調
在Fragment中調用Fragment中的方法 findFragmentById
在Fragment間利用廣播

參考自 https://blog.csdn.net/u012702547/article/details/49786417

6,Fragment部分方法

參考自 https://blog.csdn.net/harvic880925/article/details/44927375(詳細清晰 寫的太棒了)

add:添加Fragment,置於棧頂
replace:替換Fragment,清空對應容器Fragment,置於棧頂
remove:移除Fragment,顯示下層Fragment
addToBackStack:添加事務到回退棧,置於棧頂
popBackStack:將最上層的事務彈出回退棧(根據具體參數,可以回退到對應的事務)

Fragment回滾以事務(FragmentTransaction)爲單位,一個事務可能包含一個或多個Fragment

Fragment拓展閱讀
Fragment全解析系列(一):那些年踩過的坑
Square:從今天開始拋棄Fragment吧!

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