二,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吧!