Fragment

1.创建模型层

2.创建能够托管fragment的activity

3.在activity的视图中为fragment的视图安排位置

4.创建UI fragment :步骤与创建activity的步骤相同

fragment无法将自己的视图显示在屏幕上,需要先把Fragment添加到Activity
5.添加UI fragment到FragmentManager

activity与fragment

activity用fragment来管理视图

托管UI fragment,activity要做的事

1.在布局中为fragment的视图安排位置
2.管理fragment实例的生命周期

托管fragment的两种方式

1.在activity布局中添加fragment :简单但不够灵活

2.在activity代码中添加fragment. 复杂灵活,可以在运行时控制fragment

fragment与activity生命周期的区别

1.fragment的生命周期方法由托管activity调用

activity的生命周期由操作系统调用。

操作系统不关心activity用来管理视图的fragment。fragment的使用是activity内部的事情

2.activity的生命周期方法如oncreate()是保护方法

fragment的生命周期方法是公共方法,因为托管fragment的activity要调用它们

FrameLayout

FrameLayout是容器性视图,是一个通用视图。

除自身组件外,托管activity布局还可以定义多个容器视图

创建fragment

1.Fragment.onCreate()方法配置了fragment的实例

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

 }

2.创建和配置fragment视图

fragment.onCreateView(……)方法 实例化fragment视图的布局,然后将实例化的View返回给托管activity

fragment.onCreateView(……)方法 也是生成组件并响应监听器的地方

//LayoutInflater以及ViewGroup  是实例化布局的必要参数
//Bundle用来储存恢复数据,可供该方法从保存状态下重建视图
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

      View view = inflater.inflate(R.layout.fragment_crime, container, false);
      return view;
}

LayoutInflater.inflate(……)方法生成fragment视图

//resource 布局资源id
//root 视图的父视图
//attachToRoot 告知布局生成器是否将生成的视图添加给父视图。false表示 以activity代码的方式添加视图
LayoutInflater.public View inflate(  int resource,   ViewGroup root, boolean attachToRoot) 

fragment和activity引用组件的区别

activity中调用Activity.findViewById(int),能够在后台自动调用View.findViewById(int)

这里写代码片

fragment中调用fragment视图的View.findViewById(int)

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_crime, container, false);
        //引用组件
        mTitleField = (EditText) view.findViewById(R.id.crime_title);

        return view;
    }

FragmentManager

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

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

以代码的方式将fragment添加到activity中,直接调用activity的FragmentManager

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crime);

        //1.获取FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();

        //2.使用容器视图资源ID向FragmentManager请求并获取fragment
        Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);

        //3.如果指定容器视图资源ID的fragment不存在,获取一个fragment并交由FragmentManager管理
        if (fragment == null) {
            // 获取一个fragment
            fragment = new CrimeFragment();
            // 把fragment交由FragmentManager管理:创建一个新的fragment事务,加入一个添加操作,然后提交该事务
            fragmentManager.beginTransaction().add(R.id.fragment_container, fragment).commit();
        }
    }

解释上段代码

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

// 创建并返回FragmentTransaction的实例
 FragmentManager.beginTransaction()
//containerViewId: 容器视图资源ID
//fragment:fragment
 FragmentTransaction add(  int containerViewId, Fragment fragment)

容器视图资源ID在FragmentManager中的作用
1.告诉FragmentManager,fragment视图应该出现在activity视图的什么位置
2.用作FragmentManager队列中fragment的唯一标识符
FragmentManager使用容器视图资源ID(FrameLayout组件的ID)去识别UI fragment

为什么要获取的fragment会存在于队列中
android销毁activity时,它的FragmentManager会将 fragment队列保存下来。

这样activity重建时,新的FragmentManager会首先获取保存的fragment队列,然后重建fragment队列,从而恢复到原来d额状态。

posted on 2017-10-11 14:15  dreamstar  阅读(79)  评论(0编辑  收藏  举报