首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》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。在接下来给出的这段代码块中实现了自动创建:


@Overridepublic 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查看标记,从而在合适的时间获取该标记的引用来实现这一点。