Android编程权威指南(第二版)第七章-UI fragment与fragment 管理器

使用activity进行UI设计时,有很多的不灵活的地方。activity视图可以在运行时切换,但控制视图的代码必须在activity中实现。因而,各个activity还是得和特定的用户屏幕紧紧绑定在一起。采用fragment而不是activity来管理应用UI,可绕开Android系统activity使用规则的限制。

fragment是一种控制器对象, activity可委派它完成一些任务。这些任务通常就是管理用户界面。受管的用户界面可以是一整屏或是整屏的一部分。管理用户界面的fragment又称为UI fragment。它自己也有产生于布局文件的视图。 fragment视图包含了用户可以交互的可视化UI元素。activity视图可预留供fragment视图插入的位置。如果有多个fragment要插入, activity视图也可提供多个位置。根据应用和用户的需求,可联合使用fragment及activity来组装或重新组装用户界面。

activity在其视图层级里提供一处位置用来放置fragment的视图,如图所示。 fragment本身不具有在屏幕上显示视图的能力。因此,只有将它的视图放置在activity的视图层级结构中, fragment视图才能显示在屏幕上。

项目需要在添加新的依赖support-v4库,会用到的支持库类,

一个是Fragment类(android.support.v4.app.Fragment),另一个是FragmentActivity(android.support.v4.app.Fragment- Activity

第一步,布局文件,activity布局文件,里面有frameLayout,作为加载fragment布局文件的容器,创建一个新的fragment布局文件,用于放置在frameLayout中。

第二步,创建新类继承Fragment类,对于fragment布局内的组件的响应事件都定义在这里面,fragment生成View整体返回给activity进行托管,这时,activity并不需要对fragment内部进行管理,不用在activity中去定义重写这些方法,activity只需要使用FragmentManager对fragment进行管理就ok了,这也是使用fragment的灵活性的原因。

import android.support.v4.app.Fragment;//导入的包名,支持库版Fragment
public class ***Fragment extends Fragment {

  //本地变量

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {

    //生成视图

    //引用fragment中的组件,并添加对应的监听器方法

    //返回视图给activity,fragment整体由activity托管

  }
}

fragment 的 视 图 并没 有 在 Fragment.onCreate(...) 方法中生成 。虽然我们在Fragment.onCreate(...)方法中配置了fragment实例,但创建和配置fragment视图是onCreateView方法完成的.该方法实例化fragment视图的布局,然后将实例化的View返回给托管 activity。LayoutInflater及ViewGroup是实例化布局的必要参数。Bundle用来存储恢复数据,可供该方法从保存状态下重建视图。

第三步 在activity中创建FragmentManager,对fragment进行管理

FragmentManager类负责管理fragment并将它们的视图添加到activity的视图层级结构中。

FragmentManager类具体管理的是:fragment队列 fragment事务回退栈

public class ***Activity extends FragmentActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity布局文件);

    FragmentManager fm = getSupportFragmentManager();//创建一个FM实例

    Fragment fragment = fm.findFragmentById(R.id.activity中frame容器名称);

    //实例化activity布局中的fragment组件作为接纳的容器

    if (fragment == null) {
      fragment = new ***Fragment();//实例化一个***fragment类
      fm.beginTransaction()
        .add(R.id.fragment_container, fragment)
        .commit();

      //创建一个新的fragment事务,加入一个添加操作,然后提交该事务
    }

  }

}

fragment事务被用来添加、移除、附加、分离或替换fragment队列中的fragment。这是使用fragment在运行时组装和重新组装用户界面的关键。

FragmentManager.beginTransaction()方法创建并返回FragmentTransaction实例。FragmentTransaction类使用了名为fluent interface的接口方法,通过该方法配置FragmentTransaction返回FragmentTransaction类对象,而不是void,由此可得到一个FragmentTransaction队列。

 

 fragment 生命周期(没有描述很清楚,建议查阅更多的资料)

activity的FragmentManager负责调用队列中fragment的生命周期方法。添加fragment供FragmentManager管理时, onAttach(Activity)、 onCreate(Bundle)以及onCreateView(...)
方法会被调用。

托管activity的onCreate(...)方法执行后, onActivityCreated(...)方法也会被调用。因为我们正在CrimeActivity.onCreate(...)方法中添加CrimeFragment,所以fragment被添加后,该方法会被调用。

 

合理使用fragment,一个良好的使用原则是:应用单屏至多使用2~3个fragment。对屏幕大小不同的设备进行不同的fragment布局

posted @ 2017-03-08 19:59  HeLing_CC  阅读(348)  评论(0)    收藏  举报