为什么要使用fragment?
1.activity本身不具有灵活性,使用fragment可以组装activity,比如平板上的列表明细界面。
2.便于将应用的UI分解成块,用于其他类型的应用。
activity托管fragment:activity在其视图层级里提供一处位置用来放置fragment的视图。fragment本身不具有在屏幕上显示视图的能力,只有将它的视图放置在activity的视图层级结构中,fragment视图才能显示在屏幕上。
托管UI fragment,activity必须做到:
1.在布局中为fragment的视图安排位置
2.管理fragment实例的生命周期
activity托管UI fragment的两种方式:
1.在activity布局中添加fragment
不够灵活,绑定了fragment视图与activity视图,在activity的生命周期中无法切换fragment视图。
2.在activity代码中添加fragment
具有灵活性。
Fragment.onCreate(Bundle)是公共方法,而Activity.onCreate(Bundle)是保护方法,Fragment的生命周期方法必须是公共方法,因为托管fragment的activity要调用它们。
Fragment.onCreate(...)配置了fragment实例,但没有生成视图。
创建和配置fragment视图是另一个fragment生命周期方法完成的:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_anyname, container, false);
return view;
}
该方法实例化fragment视图的布局,然后将实例化的View返回给托管的activity。LayoutInflater及ViewGroup是实例化布局的必要参数。Bundle用来存储恢复数据,供该方法从保存状态下重建视图。
调用LayoutInflater.inflate(...)方法生成视图,第二个参数是视图的父视图,第三个参数告知布局生成器是否将生成的视图添加给父视图,这里传入false参数,因为是以activity代码的方式添加视图。
添加UI fragment到FragmentManager
FragmentManager类具体管理:
1.fragment队列
2.fragment事务回退栈
fragment事务被用来添加、移除、附加、分离或替换fragment队列中的fragment,这是使用fragment在运行时组装和重新组装用户界面的关键。
在Activity的onCreate(...)方法中:
//获取FragmentManager
FragmentManager fm = getSupportFragmentManager();
//activity被销毁时,它的FragmentManager会将fragment队列保存下来。
Fragment fragment = fm.findFragmentById(R.id.fragment_container);
if(fragment ==null) {
fragment = createFragment();
//创建并提交一个fragment事务
fm.beginTransaction()
/*两个参数,容器视图资源ID和新建的fragment,容器视图资源ID作用:
1.告诉FragmentManager,fragment视图应该出现在activity视图的什么位置
2.用作FragmentManager队列中fragment的唯一标识符
如需从FragmentManager中获取Fragment,使用容器视图资源ID就行了,即每个fragment创建不同ID的容器*/
.add(R.id.fragment_container,fragment)
.commit();
}
使用fragment前先添加support-v4支持包。
一个良好的使用原则:应用单屏至多使用2~3个fragment。