万书网 > 文学作品 > Android从入门到精通 > 第64页

第64页



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(getActivity(),



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);  //设置列表为单选模式