Android 面試題之Fragment相關(guān)

Fragment的replace和add方法的區(qū)別

回答提示

在項(xiàng)目中進(jìn)行Fragment切換的時候,可以用replaced()方法來切換苟鸯,也可以用add()同蜻。

區(qū)別

add是吧一個Fragment添加到一個容器Container中

replace是先remove相同id的所有Fragment,然后在add當(dāng)前這個Fragment

需要注意

使用replace()切換的話早处,F(xiàn)ragment都會重新實(shí)例化湾蔓,重新加載數(shù)據(jù),如何每次加載的數(shù)據(jù)都是從網(wǎng)絡(luò)中獲取的砌梆,這樣就會帶來性能的問題默责。

官方說明:replace()方法,只是在上一個Fragment不在使用時才調(diào)用咸包。如果上一個Fragment還需要使用的話桃序,應(yīng)該使用add()方法切換。

Activity和Fragment生命周期有哪些烂瘫?

Activity:

onCreate->onStart->onResume->onPause->onStop->onDestroy媒熊。

Fragment:

onAttach->onCreate->onCreateView->onActivityCreated>onStart->onResume->onPause->onStop->onDestroyView

Fragment 跟 Activity 之間是如何傳值的奇适?

面試經(jīng)驗(yàn):

這個問題真實(shí)場景經(jīng)常見,面試官就想看看大家是否有過真實(shí)開發(fā)經(jīng)驗(yàn)芦鳍,大家先說說如何傳值嚷往,先讓面試官感覺大家有經(jīng)驗(yàn)確實(shí)干過,然后在介紹下在真實(shí)開發(fā)的場景哪里用過柠衅,然后也介紹下一般使用EventBus或者RxBus這樣讓人感覺滿滿的干貨皮仁,談工資也比較好談,目前開發(fā)中用一個activity加載幾個fragment是非常常見的菲宴,例如:訂單中心贷祈,主頁面架構(gòu)等等。不可避免的就需要用到activity與fragment之間進(jìn)行某些值的傳遞喝峦,那么兩者之間是如何值傳遞的呢势誊?

答案解析

當(dāng) Fragment 跟 Activity 綁定之后,在 Fragment 中可以直接通過 getActivity()方法獲取到其綁定的 Activity 對象谣蠢,這樣就可以調(diào)用 Activity 的方法了键科。在 Activity 中可以通過如下方法獲取到 Fragment 實(shí)例

FragmentManager fragmentManager=getFragmentManager();
Fragment fragment=fragmentManager.findFragmentByTag(tag);
Fragment fragment=fragmentManager.findFragmentById(id);

獲取到 Fragment 之后就可以調(diào)用 Fragment 的方法。也就實(shí)現(xiàn)了通信功能漩怎。

另外也可以調(diào)用 fragment.setArguments(Bundle)方法,將數(shù)據(jù)綁定到 Fragment 域中嗦嗡。
更多資料參考:Activity和Fragment之間的數(shù)據(jù)通信

描述一下 Fragment 的生命周期

描述一下 Fragment 的生命周期

面試官問這個問題就想看看大家對Fragment是否熟悉勋锤,畢竟Fragment用戶體驗(yàn)很好,開發(fā)經(jīng)常用侥祭,問這個問題還算正常叁执。

日常開發(fā)中,fragment的使用是必不可少的矮冬,所以它也是基礎(chǔ)面試中幾乎必問的問題之一谈宛。fragment的生命周期和activity類似,有多出來幾個生命周期胎署,我們只需要對這幾個多出來的生命周期掌握了就可以了吆录,其他的都差不多。


  • onAttach()
    Fragment和Activity建立關(guān)聯(lián)的時候調(diào)用琼牧,被附加到Activity中去恢筝。
  • onCreate()
    系統(tǒng)會在創(chuàng)建Fragment時調(diào)用此方法【薹唬可以初始化一段資源文件等等撬槽。
  • onCreateView()
    系統(tǒng)會在Fragment首次繪制其用戶界面時調(diào)用此方法。 要想為Fragment繪制 UI趾撵,從該方法中返回的 View 必須是Fragment布局的根視圖侄柔。如果Fragment未提供 UI,您可以返回 null。
  • onViewCreated()
    在Fragment被繪制后暂题,調(diào)用此方法移剪,可以初始化控件資源。
  • onActivityCreated()
    當(dāng)onCreate()敢靡,onCreateView()挂滓,onViewCreated()方法執(zhí)行完后調(diào)用,也就是Activity被渲染繪制出來后啸胧。
  • onPause()
    系統(tǒng)將此方法作為用戶離開Fragment的第一個信號(但并不總是意味著此Fragment會被銷毀)進(jìn)行調(diào)用赶站。 通常可以在此方法內(nèi)確認(rèn)在當(dāng)前用戶會話結(jié)束后仍然有效的任何更改(因?yàn)橛脩艨赡懿粫祷兀?/li>
  • onDestroyView()
    Fragment中的布局被移除時調(diào)用纺念。
  • onDetach()
    Fragment和Activity解除關(guān)聯(lián)的時候調(diào)用贝椿。

ViewPager和Fragment使用過程中會遇到哪些問題

回答提示:

1. 適配器的選擇

使用ViewPager加載多個Fragment時,我一般選擇FragmentPagerAdapter陷谱。

需要大家注意:

  • FragmentPagerAdapter:該類內(nèi)的每一個生成的 Fragment 都將保存在內(nèi)存之中烙博,因此適用于那些相對靜態(tài)的頁,數(shù)量也比較少的場景

  • 但是烟逊,如果需要處理有很多頁渣窜,并且數(shù)據(jù)動態(tài)性較大、占用內(nèi)存較多的情況宪躯,這時候乔宿,我們選擇怎么是的適配器呢?

  • 應(yīng)該使用FragmentStatePagerAdapter

  • FragmentStatePagerAdapter:會把已經(jīng)創(chuàng)建的Fragment進(jìn)行保存访雪。會保持Fragment的狀態(tài) 通過源碼分析發(fā)現(xiàn):

  • FragmentStatePagerAdapter這個類抽象出了一個getItem()方法详瑞,用于創(chuàng)建對應(yīng)的Fragment 而FragmentStatePagerAdapter的.instantiateItem()方法實(shí)現(xiàn)中,調(diào)用了getIitem()方法臣缀。 調(diào)用該instantiateItem()方法時坝橡,判斷一下要生成的 Fragment 是否已經(jīng)生成過了,如果生成過了精置,就使用舊的计寇,舊的將被 Fragment.attach();

  • 如果沒有脂倦,就調(diào)用 getItem() 生成一個新的饲常,新的對象將被 FragmentTransation.add()。 FragmentStatePagerAdapter會將所有生成的 Fragment 對象通過 FragmentManager 保存起來備用狼讨,以后需要該 Fragment 時贝淤,都會從 FragmentManager 讀取,而不會再次調(diào)用 getItem() 方法政供。

2. Fragment數(shù)據(jù)的緩存

  • Fragment在初始化View對象播聪,把該對象作為一個成員變量進(jìn)行保存朽基。 再一次初始化Fragment對應(yīng)的View對象時,判斷當(dāng)前成員變量View對象是否為空离陶。 如果為空稼虎,創(chuàng)建新的View對象,否則招刨,不在創(chuàng)建霎俩。這樣就可以做到對Fragemnt進(jìn)行數(shù)據(jù)緩存

  • 這樣做的好處:避免了每次加載Fragment都要重新創(chuàng)建View,加載數(shù)據(jù)了沉眶。提高了性能打却,以及減少了內(nèi)存的開銷。

3. ViewPager預(yù)加載

  • 我們知道谎倔,系統(tǒng)的ViewPager默認(rèn)提供預(yù)加載機(jī)制柳击。但是,根據(jù)業(yè)務(wù)需要片习,取消掉對應(yīng)的預(yù)加載機(jī)制捌肴。 可以這樣做:

  • 替換掉系統(tǒng)原生的Viewpager類。將該類中的一個變量mOffscreenPageLimit 設(shè)置為0,不進(jìn)行預(yù)加載

4. Fragment嵌套Fragment

  • 在Fragment中嵌套Fragment時藕咏,一定要使用getChildFragmentManager();
  • 否則状知,會在ViewPager中出現(xiàn)fragment不會加載的情況,即fragment出現(xiàn)空白頁的情況孽查。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末试幽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卦碾,更是在濱河造成了極大的恐慌,老刑警劉巖起宽,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洲胖,死亡現(xiàn)場離奇詭異,居然都是意外死亡坯沪,警方通過查閱死者的電腦和手機(jī)绿映,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腐晾,“玉大人叉弦,你說我怎么就攤上這事≡逄牵” “怎么了淹冰?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巨柒。 經(jīng)常有香客問我樱拴,道長柠衍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任晶乔,我火速辦了婚禮珍坊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘正罢。我一直安慰自己阵漏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布翻具。 她就那樣靜靜地躺著履怯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呛占。 梳的紋絲不亂的頭發(fā)上虑乖,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機(jī)與錄音晾虑,去河邊找鬼疹味。 笑死,一個胖子當(dāng)著我的面吹牛帜篇,可吹牛的內(nèi)容都是我干的糙捺。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼笙隙,長吁一口氣:“原來是場噩夢啊……” “哼洪灯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起竟痰,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤签钩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后坏快,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體铅檩,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年莽鸿,在試婚紗的時候發(fā)現(xiàn)自己被綠了昧旨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡祥得,死狀恐怖兔沃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情级及,我是刑警寧澤乒疏,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站饮焦,受9級特大地震影響缰雇,放射性物質(zhì)發(fā)生泄漏入偷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一械哟、第九天 我趴在偏房一處隱蔽的房頂上張望疏之。 院中可真熱鬧,春花似錦暇咆、人聲如沸锋爪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽其骄。三九已至,卻和暖如春扯旷,著一層夾襖步出監(jiān)牢的瞬間拯爽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工钧忽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毯炮,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓耸黑,卻偏偏與公主長得像桃煎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子大刊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容