為了協助管理片段,Android 提供 類別 FragmentManager 。 每個活動都有 一個 實例 Android.App.FragmentManager ,其會尋找或動態變更其片段。 這些變更的每個集合稱為交易,並使用 類別中包含的Android.App.FragmentTransation其中一個 API 來執行,而這個 API 是由 所FragmentManager管理。 活動可能會啟動如下的交易:
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
這些片段的變更會使用 之類的方法在 FragmentTransaction 實例中執行,Replace().Remove(),然後使用 來套用Commit()Add()變更。 交易中的變更不會立即執行。
相反地,它們會排定儘快在活動的UI線程上執行。
下列範例示範如何將片段新增至現有的容器:
// Create a new fragment and a transaction.
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
DetailsFragment aDifferentDetailsFrag = new DetailsFragment();
// The fragment will have the ID of Resource.Id.fragment_container.
fragmentTx.Add(Resource.Id.fragment_container, aDifferentDetailsFrag);
// Commit the transaction.
fragmentTx.Commit();
如果在呼叫 之後 Activity.OnSaveInstanceState() 認可交易,則會擲回例外狀況。 這是因為當活動儲存其狀態時,Android 也會儲存任何託管片段的狀態。 如果在此點之後認可任何片段交易,還原活動時,這些交易的狀態將會遺失。
藉由呼叫 FragmentTransaction.AddToBackStack(),即可將片段交易儲存至活動的後端堆棧。 這可讓使用者在按下 [上一步] 按鈕時,透過片段變更向後巡覽。 若未呼叫此方法,移除的片段將會終結,而且如果使用者流覽回活動,將無法使用。
下列範例示範如何使用 AddToBackStack 的 方法來 FragmentTransaction 取代一個 Fragment,同時保留後端堆疊上第一個 Fragment 的狀態:
// Create a new fragment and a transaction.
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
DetailsFragment aDifferentDetailsFrag = new DetailsFragment();
// Replace the fragment that is in the View fragment_container (if applicable).
fragmentTx.Replace(Resource.Id.fragment_container, aDifferentDetailsFrag);
// Add the transaction to the back stack.
fragmentTx.AddToBackStack(null);
// Commit the transaction.
fragmentTx.Commit();
與片段通訊
FragmentManager 知道連結至 Activity 的所有片段,並提供兩種方法來協助尋找這些片段:
FindFragmentById – 這個方法會使用配置檔案中指定的標識碼或當片段新增為交易的一部分時,找到片段。
FindFragmentByTag – 這個方法可用來尋找片段,該片段具有配置檔案中提供的標記,或是在交易中新增的標記。
片段和活動都會參考 FragmentManager,因此會使用相同的技術來回通訊。 應用程式可以使用這兩種方法的其中一個來尋找參考片段,將該參考轉換成適當的類型,然後直接呼叫 Fragment 上的方法。 下列代碼段提供範例:
活動 FragmentManager 也可以使用 來尋找片段:
var emailList = FragmentManager.FindFragmentById<EmailListFragment>(Resource.Id.email_list_fragment);
emailList.SomeCustomMethod(parameter1, parameter2);
與活動通訊
片段 Fragment.Activity 可以使用 屬性來參考其主機。 藉由將 Activity 轉換成更特定的類型,活動可以呼叫其主機上的方法和屬性,如下列範例所示:
var myActivity = (MyActivity) this.Activity;
myActivity.SomeCustomMethod();