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