1. 程式人生 > >Android Fragment的基礎知識點

Android Fragment的基礎知識點

一、Fragment的簡介 Fragment可以理解為一個具有自己生命週期的控制元件,它有自己的處理輸入事件的能力和生命週期,但是必須依賴於Activity,能互相通訊和託管。 使用Fragment有如下優點: 程式碼複用。特別適用於模組化的開發,因為一個Fragment可以被多個Activity巢狀,有個共同的業務模組就可以複用了,是模組化UI的良好元件。 Activity用來管理Fragment。Fragment的生命週期是寄託到Activity中,Fragment可以被Attach新增和Detach釋放。 可控性。Fragment可以像普通物件那樣自由的建立和控制,傳遞引數更加容易和方便,也不用處理系統相關的事情,顯示方式、替換、不管是整體還是部分,都可以做到相應的更改。 Fragment是view controllers,它們包含可測試,解耦的業務邏輯塊,由於Fragment是構建在view之上的,而view很容易實現動畫效果,因此Fragment在螢幕切換時具有更好的控制。二、Fragment的生命週期
Fragment的生命週期類似Activity,如下圖,Activity生命週期與Fragment生命週期對比圖如下:
三、Fragment的兩種新增方式 add方式Fragment的新增與FragmentManager及FragmentTransaction有關,參考如下程式碼:
public void add(BaseLibFragment fragment, int id,String tag){FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //優先檢查,fragment是否存在,避免重疊 BaseLibFragment tempFragment = (BaseLibFragment)fragmentManager.findFragmentByTag(tag); if(EmptyUtils.isNotEmpty(tempFragment)){fragment = tempFragment; } if(
fragment.isAdded()){ addOrShowFragment(fragmentTransaction,fragment,id,tag); }else{ if(currentFragment!=null&&currentFragment.isAdded()){fragmentTransaction.hide(currentFragment).add(id, fragment,tag).commit(); }else{fragmentTransaction.add(id, fragment,tag).commit(); } currentFragment = fragment; } } /** * 顯示 fragment * @param fragment */ private void addOrShowFragment(FragmentTransaction transaction, BaseLibFragment fragment, int id,String tag) { if(currentFragment == fragment) return; if (!fragment.isAdded()) { // 如果當前fragment未被新增,則新增到Fragment管理器中 transaction.hide(currentFragment).add(id, fragment,tag).commit(); } else { transaction.hide(currentFragment).show(fragment).commit(); } currentFragment.setUserVisibleHint(false); currentFragment = fragment; currentFragment.setUserVisibleHint(true); }
程式中的邏輯程式碼所做的工作是將新增加的Fragment給顯示出來。在新增Fragment前,先通過環境變數獲取FragmentManager物件,在通過FragmentManager物件得到FragmentTransaction物件,另外還需判斷被新增的Fragment物件是否存在。 replace方式 replace方式的參考程式碼如下:
publicvoidreplace(BaseLibFragment fragment, int id){ FragmentManager fragmentManager = ((BaseLibActivity)mContext).getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(id, fragment); fragmentTransaction.commit(); }
替換方式比較直接,根據id值直接填換就行。四、FragmentManager幾種不同方式的獲取 FragmentManager存在三種不同的獲取方式getFragment、getSupportFragmentManager和getChildFragmentManager,在實際使用中容易搞混下面對這三種方式進行一下區分。 getFragmentManager:Fragment是Android3.0以後引入的控制元件,在針對Android3.0以上的版本進行程式設計時在Activity中直接呼叫getFragmentManager就可以得到FragmentManager。 getSupportFragmentManager:承上所述,當APK為了相容Android3.0以下的版本時,Android SDK提供了一個向下的相容包android.support.v4。在程式碼中需要將程式設計Fragment繼承的導包由android.app.Fragment修改為android.support.v4.app.Fragment,另外將控制Fragment的Activity修改為繼承自FragmentActivity。 getChildFragMentManager:當Fragment巢狀有Fragment時,需要用getChildFragmentManager來獲取Fragment。