Fragment作為Android最基本,最重要的基礎概念之一,也是Activity的好搭檔,在開發中經常會和他打交道。今天的三問就說關于Fragment:
- Fragment生命周期,當hide,show,replace時候生命周期變化。
- Activity 與 Fragment,Fragment 與 Fragment之間怎麼互動通信。
- Fragment遇到viewpager遇到過什麼問題嗎。
Fragment生命周期,當hide,show,replace時候生命周期變化
1)生命周期:
-
:Fragment和Activity相關聯時調用。可以通過該方法擷取Activity引用,還可以通過getArguments()擷取參數。onAttach()
-
:Fragment被建立時調用。onCreate()
-
:建立Fragment的布局。onCreateView()
-
:當Activity完成onCreate()時調用。onActivityCreated()
-
:當Fragment可見時調用。onStart()
-
:當Fragment可見且可互動時調用。onResume()
-
:當Fragment不可互動但可見時調用。onPause()
-
:當Fragment不可見時調用。onStop()
-
:當Fragment的UI從視圖結構中移除時調用。onDestroyView()
-
:銷毀Fragment時調用。onDestroy()
-
:當Fragment和Activity解除關聯時調用。onDetach()
每個調用方法對應的生命周期變化:
-
: onAttach()->…->onResume()。add()
-
: onPause()->…->onDetach()。remove()
-
: 相當于舊Fragment調用remove(),新Fragment調用add()。remove()+add()的生命周期加起來replace()
-
: 不調用任何生命周期方法,調用該方法的前提是要顯示的 Fragment已經被添加到容器,隻是純粹把Fragment UI的setVisibility為true。show()
-
: 不調用任何生命周期方法,調用該方法的前提是要顯示的Fragment已經被添加到容器,隻是純粹把Fragment UI的setVisibility為false。hide()
Activity 與 Fragment,Fragment 與 Fragment之間怎麼互動通信。
- Activity 與 Fragment通信
Activity有Fragment的執行個體,是以可以執行Fragment的方法,或者傳入一個接口。同樣,Fragment可以通過
getActivity()
擷取Activity的執行個體,也是可以執行方法。
- Fragment 與 Fragment之間通信
1)直接擷取另一個Fragmetn的執行個體
getActivity().getSupportFragmentManager().findFragmentByTag("mainFragment");
2)接口回調 一個Fragment裡面去實作接口,另一個Fragment把接口執行個體傳進去。
3)Eventbus等架構。
Fragment遇到viewpager遇到過什麼問題嗎。
- 滑動的時候,調用setCurrentItem方法,要注意第二個參數
。傳false,就是直接跳到fragment,傳true,就是平滑過去。一般首頁切換頁面都是用false。smoothScroll
- 禁止預加載的話,調用
是無效的,因為方法裡面會判斷是否小于1。需要重寫setOffscreenPageLimit(0)
方法,判斷fragment是否可見。setUserVisibleHint
- 不要使用
擷取activity執行個體,容易造成空指針,因為如果fragment已經onDetach()了,那麼就會報空指針。是以要在getActivity()
方法裡面,就去擷取activity的上下文。onAttach
-
對limit外的Fragment銷毀,生命周期為onPause->onStop->onDestoryView->onDestory->onDetach, onAttach->onCreate->onCreateView->onStart->onResume。也就是說切換fragment的時候有可能會多次FragmentStatePagerAdapter
,是以需要注意處理資料。onCreateView
- 由于可能多次
,是以我們可以把view儲存起來,如果為空再去初始化資料。見代碼:onCreateView
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if (null == mFragmentView) {
mFragmentView = inflater.inflate(getContentViewLayoutID(), null);
ButterKnife.bind(this, mFragmentView);
isDestory = false;
initViewsAndEvents();
}
return mFragmentView;
}
Android開發者們,快來關注公衆号【碼上積木】,每天三問面試題,并詳細剖析,助你成為offer收割機。
積累也是一種力量。

點點在看你最好看