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)空白頁的情況孽查。