可以分为下面的几部分:

    • 使用支持库

    • 创建一个Fragment

    • 创建一个动态UI

    • 多个Fragment之间的通信

1、使用支持库

如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。

如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。

使用支持库的步骤:

使用SDK下的SDK Manager工具下载Android Support Package

2. 在您的Android工程的顶级目录下创建一个libs目录

3. 找到您的SDK下的/extras/android/support/v4/android-support-v4.jar,并且拷贝到您的项目的libs下,选中这个jar包 → 右键 →Build Path → Add to Build Path

4.在您的项目的Manifest.xml文件的<manifest>标签下添加:

<uses-sdkandroid:minSdkVersion="4"

  android:targetSdkVersion="8"/>

  其中targetSdkVersion是您的软件最小支持的版本

5.如果您的项目支持3.0以下的版本,请导入如下的包:android.support.v4.*;

在使用FragmentActivity请继承FragmentActivity而不是Activity。如果您的系统是3.0或以上版本,同样需要导入类似的包,但是可以使用普通的Activity

2、创建一个Fragment

Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity

创建一个Fragment

创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局。例子:

Fragment的生命周期方法依赖于Activity的生命周期,例如一个ActivityonPause()的生命周期方法被调用的时候这个Activity中的所有的FragmentonPause()方法也将被调用。

更多的内容请参照类Fragment

使用XML添加FragmentActivity

尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。

说明:上面的所说的FragmentActivity适用在API3.0以下的版本,3.0及以上的版本可以使用普通的Activity

例子:

上面使用fragment标签,android:name=””指定一个添加到xml中的Fragment。对于创建不同的屏幕尺寸布局的更多信息,请阅读支持不同的屏幕尺寸。

当您添加一个片段一个活动布局定义的布局XML文件中的片段,你不能删除在运行时的片段。如果您打算在用户交互和交换片段,你必须添加的活性片段的活动时第一次启动。

3、构建一个灵活的UI

FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的操作。

Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。

如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。

添加一个Fragment到一个Activity,必须把这个Fragment添加到一个容器视图中。例子:

Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。

一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法。例子:

由于不是定义在XML布局中的,所有可以转型删除和修改的操作。

如果替换或者删除一个Fragment然后让用户可以导航到上一个Fragment,你必须在调用commit()方法之前调用addToBackStack()方法添加到回退栈。如果你把这个Fragment添加到了回退栈,在提交之后这个Fragment是会被Stop而不是Destroyed。如果用户导航到这个Fragment,这个Fragment会被Restart而不是重新创建。如果你没有把它添加到回退栈,则在删除或者替换的时候它将被Destroyed。例子:

4、与其他Fragment的交互

两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。

为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在FragmentonAttach()

定义接口并调用方法:

实现接口,在这个方法中可以进行与其他Fragment的数据的交互:

可以通过FragmentManagerfindFragmentById()来查找一个Fragment

  1. 方法中调用这个接口中的方法。然后让Activity实现这个方法来完成ActivityFragment之间的通信。例子:


Fragment之间的通信补充

为了重用Fragment的UI组件,创建的每个Fragment都应该是自包含的、有它自己的布局和行为的模块化组件。一旦你定义了这些可重用的Fragment,你就可以把它们跟一个Activity关联,并把它们跟应用程序的逻辑相连来实现全部的组合式UI。

现实中我们经常想要一个Fragment跟另一个Fragment进行通信,例如,要基于一个用户事件来改变内容。所有的Fragment间的通信都是通过跟关联的Activity来完成的。另个Fragment不应该直接通信。也就是说Fragment间不直接通信,通过Activity转一下,按java常规,转一下多是使用Interface实现的。

定义Interface

为了让Fragment跟它的Activity通信,你可以在Fragment类中定义一个接口,并在它所属的Activity中实现该接口。Fragment在它的onAttach()方法执行期间捕获该接口的实现,然后就可以调用接口方法,以便跟Activity通信。

以下是Fragment跟Activity通信的示例:

[java] view plain copy print ?
  1. publicclassHeadlinesFragmentextendsListFragment{
  2. OnHeadlineSelectedListenermCallback;
  3. //ContainerActivitymustimplementthisinterface
  4. publicinterfaceOnHeadlineSelectedListener{
  5. publicvoidonArticleSelected(intposition);
  6. }
  7. @Override
  8. publicvoidonAttach(Activityactivity){
  9. super.onAttach(activity);
  10. //Thismakessurethatthecontaineractivityhasimplemented
  11. //thecallbackinterface.Ifnot,itthrowsanexception
  12. try{
  13. mCallback=(OnHeadlineSelectedListener)activity;
  14. }catch(ClassCastExceptione){
  15. thrownewClassCastException(activity.toString()
  16. +"mustimplementOnHeadlineSelectedListener");
  17. }
  18. }
  19. ...
  20. }

现在,这个Fragment就可以通过调用OnHealdlineSelectedListener接口实例mCallback的onArticleSelected()方法(或其他的接口中的方法)给Activity发送消息。

例如,在Fragment中的下列方法会用户点击列表项时被调用。该Fragment使用回调接口把该事件发送给它的父Activity。

[java] view plain copy print ?
  1. @Override
  2. publicvoidonListItemClick(ListViewl,Viewv,intposition,longid){
  3. //Sendtheeventtothehostactivity
  4. mCallback.onArticleSelected(position);
  5. }


实现Interface

为了从Fragment中接收事件回调,包含Fragment的Activity必须实现Fragment类中定义的接口。

例如,下面Activity实现了上面示例中定义的接口:

[java] view plain copy print ?
  1. publicstaticclassMainActivityextendsActivity
  2. implementsHeadlinesFragment.OnHeadlineSelectedListener{
  3. ...
  4. publicvoidonArticleSelected(intposition){
  5. //TheuserselectedtheheadlineofanarticlefromtheHeadlinesFragment
  6. //Dosomethingheretodisplaythatarticle
  7. }
  8. }



把消息传递给另一个Fragment

通过使用findFragmentById()方法捕获Fragment实例,宿主Activity可以把消息发送给该Fragment,然后直接调用该Fragment的公共方法。

例如,上面的示例,Activty通过Interface的实现方法,传递数据到另一个Fragment。

[java] view plain copy print ?
  1. publicstaticclassMainActivityextendsActivity
  2. implementsHeadlinesFragment.OnHeadlineSelectedListener{
  3. ...
  4. publicvoidonArticleSelected(intposition){
  5. //TheuserselectedtheheadlineofanarticlefromtheHeadlinesFragment
  6. //Dosomethingheretodisplaythatarticle
  7. ArticleFragmentarticleFrag=(ArticleFragment)
  8. getSupportFragmentManager().findFragmentById(R.id.article_fragment);
  9. if(articleFrag!=null){
  10. //Ifarticlefragisavailable,we'reintwo-panelayout...
  11. //CallamethodintheArticleFragmenttoupdateitscontent
  12. articleFrag.updateArticleView(position);
  13. }else{
  14. //Otherwise,we'reintheone-panelayoutandmustswapfrags...
  15. //Createfragmentandgiveitanargumentfortheselectedarticle
  16. ArticleFragmentnewFragment=newArticleFragment();
  17. Bundleargs=newBundle();
  18. args.putInt(ArticleFragment.ARG_POSITION,position);
  19. newFragment.setArguments(args);
  20. FragmentTransactiontransaction=getSupportFragmentManager().beginTransaction();
  21. //Replacewhateverisinthefragment_containerviewwiththisfragment,
  22. //andaddthetransactiontothebackstacksotheusercannavigateback
  23. transaction.replace(R.id.fragment_container,newFragment);
  24. transaction.addToBackStack(null);
  25. //Committhetransaction
  26. transaction.commit();
  27. }
  28. }
  29. }



转载自:http://www.cnblogs.com/xinye/archive/2012/08/28/2659712.html http://blog.csdn.net/xyz_lmn/article/details/8631195

更多相关文章

  1. Android启动App时白屏的解决方法
  2. Android消息机制Handler的工作过程详解
  3. Android日志工具Log
  4. Android小项目之四 自动更新检查的逻辑
  5. Android中SQLite 使用方法详解
  6. 关于webview最详细讲解(包含 h5 和android 交互)
  7. 在android的状态栏中增加menu,home和back快捷键的方法
  8. Android(安卓)Activity为什么要细化出onCreate、onStart、onResu
  9. android与javascript相互调用

随机推荐

  1. android中通过代码启动应用程序
  2. android:scaleType="matrix"布局文件加载
  3. android轮播图封装 (网络图片glide解析,
  4. 稳定获取Android设备唯一码(UUID)的解决方
  5. android下使用adb启动程序或者服务
  6. Android(安卓)低功耗蓝牙
  7. ok6410 android driver(8)
  8. [置顶] Android底层库和程序
  9. android 数据储存——--SQLite存储方式(3)
  10. android services——学习