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额状态。