DetailFragment details = new DetailFragment(); //实例化DetailFragment的对象
FragmentTransaction ft = getFragmentManager()
.beginTransaction(); //获得一个FragmentTransaction的实例
ft.add(android.R.id.content, details)mit(); //添加一个显示详细内容的Fragment
ftmit(); //提交事务
Fragment比较强大的功能之一就是可以合并两个Activity,从而让这两个Activity在一个屏幕上显示。如图5.14所示(参照Android官方文档),左边的两个图分别代表两个Activity,右边的图表示包括两个Fragment的Activity,其中第一个Fragment的内容是Activity A,第二个Fragment的内容是Activity B。
图5.14 使用Fragment合并两个Activity
下面通过一个具体的实例介绍如何使用Fragment合并两个Activity,从而实现在一个屏幕上显示标题列表及选定标题对应的详细内容。
例5.7 在Eclipse中创建Android项目,名称为5.7,实现在一个屏幕上显示标题列表及选定标题对应的详细内容。(实例位置:光盘\TM\sl\5\5.7)
(1)创建布局文件。为了让该程序既支持横屏,又支持竖屏,所以需要创建两个布局文件,分别是在res\layout目录中创建的main.xml和在res\layout-land目录中创建的main.xml。其中在layout目录中创建的main.xml是支持手机时用的布局文件,在该文件中,只包括一个Fragment;在layout-land目录中创建的是支持平板电脑时用的布局文件,在该文件中,需要在水平线性布局管理器中添加一个Fragment和一个FrameLayout。在layout-land目录中创建的main.xml的具体代码如下:
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/titles"
android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" />
android:layout_weight="2"
android:layout_width="0px"
android:layout_height="match_parent"
android:background="?android:attr/detailsElementBackground" />
说明: 在上面的代码中,加粗的代码同在layout目录中添加的main.xml中的代码是完全一样的。
(2)创建一个名称为Data的final类,在该类中创建两个静态的字符串数组常量,分别用于保存标题和详细内容。Data类的关键代码如下:
public final class Data {
//标题
public static final String[] TITLES = {
"线性布局",
"表格布局",
"帧布局",
"相对布局"
};
//详细内容
public static final String[] DETAIL = {
"线性布局是将放入其中的组件按照垂直或水平方向来布局,也就是控制放入其中的组件横向排列或纵向排列。" +
"在线性布局中,每一行(针对垂直排列)或每一列(针对水平排列)中只能放一个组件。" +
"并且Android的线性布局不会换行,当组件一个挨着一个排列到窗体的边缘后,剩下的组件将不会被显示出来。",
//此处省略了部分代码
};
}
(3)创建一个继承自ListFragment的ListFragment,用于显示一个标题列表,并且设置当选中其中的一个列表项时,显示对应的详细内容(如果为横屏,则创建一个DetialFragment的实例来显示,否则创建一个Activity来显示)。ListFragment类的具体代码如下:
public class ListFragment extends android.app.ListFragment {
boolean dualPane; //是否在一屏上同时显示列表和详细内容
int curCheckPosition = 0; //当前选择的索引位置
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(new ArrayAdapter
android.R.layout.simple_list_item_checked, Data.TITLES)); //为列表设置适配器
//获取布局文件中添加的FrameLayout帧布局管理器
View detailFrame = getActivity().findViewById(R.id.detail);
dualPane = detailFrame != null &&
detailFrame.getVisibility() == View.VISIBLE; //判断是否在一屏上同时显示列表和详细内容
if (savedInstanceState != null) {
curCheckPosition = savedInstanceState.getInt("curChoice", 0); //更新当前选择的索引位置
}
if (dualPane) { //如果在一屏上同时显示列表和详细内容
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); //设置列表为单选模式