讀古今文學網 > Android程序設計:第2版 > Fragment管理器 >

Fragment管理器

正如之前所述,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查看標記,從而在合適的時間獲取該標記的引用來實現這一點。