一:概念 Fragment表現(xiàn)Activity中用戶界面的一個行為或者是一部分。你可以在一個單獨的activity上把多個fragment組合成為一個多區(qū)域的UI,并且可以在多個activity中再使用。你可以認為fragment是activity的一個模塊零件,它有自己的生命周期,接收它自己的輸入事件,并且可以在activity運行時添加或者刪除。
Fragment必須總是被嵌入到一個activity之中,并且fragment的生命周期直接受其宿主activity的生命周期的影響。例如,一旦activity被暫停,它里面的所有的fragment也被暫停,一旦activity被銷毀,它里面所有的fragment也被銷毀。fragment本身不具有在屏幕上顯示視圖的能力,只有將它的視圖放置在activity的視圖結(jié)構(gòu)中,fragment視圖才能顯示在屏幕上。
二:fragment與支持庫 我們要用到兩個重要的支持庫類,一個是Fragment類 (android.support.v4.app.Fragment),另一個是FragmentActivity(android.support.v4.app.Fragment- Activity)。 使用fragment的前提是,activity知道如何管理fragment。FragmentActivity類知道如何管理支持 版本的fragment。 fragment是3.0以后的東西,為了在低版本中使用fragment就要用到android-support-v4.jar兼容包,而fragmentActivity就是這個兼容包里面的,它提供了操作fragment的一些方法,其功能跟3.0及以后的版本的Activity的功能一樣。
在 Android Studio 中增加依賴關(guān)系 選擇File → PRojectStructure…菜單項打開項目結(jié)構(gòu)對話框。 選擇左邊的應(yīng)用模板,然后在右邊點擊Dependencies選項頁。可以看到,應(yīng)用模板的依賴項 都列在這了,如圖7-10所示

單擊+號按鈕,在選擇Library dependency界面添加新的依賴項,如圖7-11所示。從列表中選 中support-v4庫后單擊OK按鈕確認。 
com.android.support包中有很多不 同的庫,如support-v13、appcompat-v7和gridlayout-v7。Google使用basename-vX模式作為支持庫 的命名約定。-vX指所支持的最低API級別。因此,以appcompat-v7為例,這里的-v7就是說Google 兼容庫可以應(yīng)用到Android API 7及以上級別的設(shè)備上。
三。托管Fragment
1生命周期 
? 在activity布局中添加fragment; ? 在activity代碼中添加fragment。 第一種方式就是使用布局fragment。這種方式簡單但不夠靈活。在activity布局中添加 fragment,就等同于將fragment及其視圖與activity的視圖綁定在一起,并且在activity的生命周期 過程中,無法切換fragment視圖。 第二種方式比較復(fù)雜,但也是唯一可以在運行時控制fragment的方式。我們自行決定何時添 加fragment以及隨后可以完成何種具體任務(wù);也可以移除fragment,用其他fragment代替當前 fragment,然后重新添加已移除的fragment。
2.一步步構(gòu)建 1)定義容器視圖用來安排fragment
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"/2)定義Fragment布局 這里只添加了一個Edit Text
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/crime_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="fragment"/></LinearLayout>3)創(chuàng)建Fragment類
fragment的視圖并沒 有在Fragment.onCreate(…)方法中生成。創(chuàng)建和配置fragment視圖是另一個 fragment生命周期方法完成的:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
該方法實例化 fragment 視圖的布局,然后將實例化的 View 返回給托管 activity 。 LayoutInflater及ViewGroup是實例化布局的必要參數(shù)。Bundle用來存儲恢復(fù)數(shù)據(jù),可供該方 法從保存狀態(tài)下重建視圖。
public class EnvironmentFragment extends Fragment { Envrionment mEnvrionment; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_environment,container,false); return v; } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mEnvrionment = new Envrionment(); }}onCreateView(…) 方法中, fragment 的視圖是直接通過調(diào)用 LayoutInflater. inflate(…)方法并傳入布局的資源ID生成的。第二個參數(shù)是視圖的父視圖,我們通常需要父 視圖來正確配置組件。第三個參數(shù)告知布局生成器是否將生成的視圖添加給父視圖。這里,我們 傳入了false參數(shù),因為我們將以activity代碼的方式添加視圖。
4)添加fragment到FragmentManager FragmentManager類負責管理fragment并將它們的視圖添加到activity的視圖層級結(jié) 構(gòu)中。首先,我們需要獲取FragmentManager本身
在托管activity中添加如下代碼
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_enviroment); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragment_container); if(fragment == null){ fragment = new EnvironmentFragment(); fm.beginTransaction().add(R.id.fragment_container,fragment).commit(); } }fragment事務(wù)被用來添加、移除、附加、分離或替換fragment隊列中的fragment。這是使用 fragment在運行時組裝和重新組裝用戶界面的關(guān)鍵。FragmentManager管理著fragment事務(wù)回 退棧。
FragmentManager.beginTransaction()方法創(chuàng)建并返回FragmentTransaction實例。 FragmentTransaction類使用了名為fluent interface的接口方法,通過該方法配置FragmentTransaction返回FragmentTransaction類對象,而不是void,由此可得到一個FragmentTransaction隊列。
add(…)方法是整個事務(wù)的核心,它含有兩個參數(shù):容器視圖資源ID和新創(chuàng)建的 CrimeFragment。容器視圖資源ID我們應(yīng)該很熟悉了,它是定義在activity_crime.xml中的 FrameLayout組件的資源ID。
容器視圖資源ID的作用有: ? 告訴FragmentManager,fragment視圖應(yīng)該出現(xiàn)在activity視圖的什么位置; ? 用作FragmentManager隊列中fragment的唯一標識符。 如需從FragmentManager中獲取CrimeFragment,使用容器視圖資源ID就行了:
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
FragmentManager使用FrameLayout組件的資源ID去識別CrimeFragment,這看上去可能有點 怪。但實際上,使用容器視圖資源ID去識別UI fragment是FragmentManager的內(nèi)部實現(xiàn)機制。如 果要向activity添加多個fragment,通常需要分別為每個fragment創(chuàng)建不同ID的容器。

新聞熱點
疑難解答