正如之前所述,fragment可以通過編程實現,也可以在佈局中通過配置實現。從編程上對fragment進行控制是通過使用Activity類的getFragmentManager方法獲取FragmentManager類的實例。Fragment管理器處理3組重要的操作:fragment標記和位置、事務及備用棧。下面我們一起通過擴展示例程序按序分析每個操作。
修改上文中的示例應用,使用編碼來創建fragment需要做兩處修改:一處在佈局文件main.xml中,另一處在SimpleFragment活動中。在佈局中,fragment元素被和它幾乎完全相同的FrameLayout取代:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_ android:layout_ > <FrameLayout android:id="@+id/date_time" android:layout_ android:layout_ android:background="@color/green" /> </LinearLayout>
與之前一樣,SimpleFragment還將繼續使用這個佈局。但是,這個佈局還不能自動創建新的fragment。在接下來給出的這段代碼塊中實現了自動創建:
@Override public void onCreate(Bundle state) { super.onCreate(state); setContentView(R.layout.main); FragmentManager fragMgr = getFragmentManager; FragmentTransaction xact = fragMgr.beginTransaction; if (null == fragMgr.findFragmentByTag(FRAG1_TAG)) { xact.add(R.id.date_time, new DateTime, FRAG1_TAG); } xact.commit; }
這些變化沒有引入新的應用特徵。運行時,這個示例版本的行為和原始的、基於佈局的版本完全一致。
這段代碼的重要特徵在於使用標籤。當一個活動還和之前所創建的fragment關聯時,完全有可能會調用其onCreate方法。當調用onCreate方法只是添加新的fragment時,會導致fragment洩露。為防止這一點,示例代碼可以利用fragment管理器的標籤和位置功能。
add方法的第三個參數是個唯一標籤,當其被添加到活動時會分配給該fragment。一旦創建了標籤,就可以使用fragment管理器的findFragmentByTag方法恢復添加到給定標籤的精確的、單一的fragment。該示例代碼檢查標記的fragment在創建新的fragment實例之前是否已經存在。如果不存在,就創建它。如果該fragment已經存在,就不需要執行額外的操作。這確保一個角色只有一個fragment,並且可以防止fragment洩露。
標記和位置還可以用於其他目的。當一個活動需要把一些狀態變化傳達給附加的fragment時,它很可能會提前標記該fragment,然後使用FragmentManager查看標記,從而在合適的時間獲取該標記的引用來實現這一點。