關於Fragment面試的詳解

大家好,今天我來給大家講一講關於安卓面試中的Fragment的面試題目,那麼接下來接入正題:

一、Fragment爲什麼會被成爲第五大組件?

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

衆所周知,在安卓中中有四大組件,分別是Activity,廣播,service,Content provider.在實際項目開發過程中,Fragment的使用頻率和作用都是十分突出的,所以說在這裏把Fragment列爲第五大組件也是可以的.有些說法把view列爲第五大組件,但是由於view沒有生命周的,這是和Fragment的不同之處.有了生命週期,Fragment可以像activity靈活的進行處理.

Fragment爲什麼會出現呢?

它其實是在安卓3.0出現的,起初啊,它只是爲了給大屏幕設備上更加靈活的展現UI所設計的.

Fragment的優點:Fragment相比Activity更加節省內存,同時UI的切換效果也更加的舒適.

綜上所述,大家可以這樣回答:首先在使用頻率上,Fragment是不屬於其它四大組件的,它有自己的生命週期,同時它可以動態靈活的加載Activity,所以說Fragement可以被稱爲第五大組件,同時Fragment並不是像Activity一樣完全獨立的,它雖然有自己的生命週期,但是它必須依附與Activity,同時它要加載到Activity當中.

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

1)添加Fragment到Activity的佈局文件當中(靜態加載)

把Fragment直接寫入Activity佈局當中,作爲XML的一個標籤

2)動態在Activity中添加Fragment(動態加載)

它使用的是FragmentManager來管理所有要啓動的Fragment,利用FragmentTransaction添加和替換相對應的Fragment,並用容器資源來作爲標記位,設置Fragment所要顯示到的Activity當中的位置,最後,需要提交commit方法來完成整個步驟.

3.FragementPagerAdapter與FragmentStatePagerAdapter區別

FragementPagerAdapter適用於頁面較少的情況,而FragmentStatePagerAdapter用於頁面較多的情況.

我看了一下源碼,首先來看FragmentStatePagerAdapter

在destroyItem這個方法中,最後一行,它使用的是mCurTransaction.remove(fragment)方法,它是真正的釋放了Fragment 的內存FragmentStatePagerAdapter是比FragementPagerAdapter更加節省內存的.

我們再來看FragementPagerAdapter

在destroyItem這個方法中,它最後一行,它是調用了mCurTransaction.detach((Fragment)object);這個方法意味着什麼,它並不是真正的內存回收,它只是把fragment的UI和Activity的UI所脫離開來,它並不會收內存.

所以我們可以這樣回答:

由於FragmentStatePagerAdapter在每次切換Viewpager的時候,它是回收內存的,所以說它適合那些頁面比較多的情況,因爲頁面比較多的時候,比較耗費內存,它會回收內存.而FragementPagerAdapter,它並沒有回收內存,它只是把UI分離,所以說它適合頁面比較少的情況,保存一下內存,對系統也沒有多大影響

二、Fragment的生命週期

首先,我們來看一下官網上面的生命週期圖

可以看到 Fragment 的生命週期和 Activity 很相似,只是多了以下幾個方法:
onAttach() 在Fragment 和 Activity 建立關聯是調用(Activity 傳遞到此方法內)
onCreateView() 當Fragment 創建視圖時調用
onActivityCreated() 在相關聯的 Activity 的 onCreate() 方法已返回時調用。
onDestroyView() 當Fragment中的視圖被移除時調用
onDetach() 當Fragment 和 Activity 取消關聯時調用。

 

可以看下幾種操作情況下Fragment 的生命週期變化

管理 Fragment 生命週期和 Activity 生命週期很相似,同時 Activity 的生命週期對 Fragment 的生命週期也有一定的影響,如下圖:

用下圖來表示 Activity 和 Fragment 的生命週期變化的先後過程是:

Fragment 生命週期與 Activity 生命週期的一個關鍵區別就在於,Fragment 的生命週期方法是由託管Activity而不是操作系統調用的。Activity 中生命週期方法都是 protected,而 Fragment 都是 public,也能印證了這一點,因爲 Activity 需要調用 Fragment 那些方法並管理它。

 

三、Fragment之間的通信

1.fragment與activity之間的通信

只要調用getActivity,就可以獲取到Activity中的方法

2.fragment與fragment之間的通信

和fragment中調用Activity方法有相同地方,首先,可以通過getActivity獲取Activity方法,然後通過findFragmentByid取到Activity中所對應的另外一個Fragment的方法,這樣就實現了fragment與fragment的通信

3.activity與fragment之間的通信

常用的方法是接口回調,你在fragment中創建一個接口,然後Activity來實現,這樣就能完成Activity調用Fragment中的方法

四、Fragment管理器:FragmentManager

Fragment的replace、add、,remove方法;

add是將fragment的實例添加到Activity的最上層,而remove大家都知道,它就是將fragment的實例從activity與fragment隊列中刪除

而replace與add的區別就是,它是替換activity的實例,不是直接把fragment直接加到activity上層,它是把activity最上層的fragment替換成它想替換的fragment.

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