1.灵活的UI设计。为了适应用户或设备的需求,activity界面可以在运行时组装,甚至重新组装,而activity没有这个灵活性,activity的视图可以在运行时切换,但控制视图的代码必须在activity中实现,结果每个activity还是需要与特定的用户界面绑定在一起,由此为了灵活性,这边需要引入fragment来控制界面
2.采用fragment而不是activity来管理UI可以绕开Android系统activity的规则的限制,fragment是一种控制器对象,activity可以委派他执行任务,这些任务正常是管理用户的界面,可以是横屏也可以是整屏的一部分,管理UI界面你的fragment叫做UIfragment,他有自己的布局视图,fragment视图包含了用户可以交互的可视化的UI元素
3.activity可以预留位置供fragment视图插入,如果有多个视图要插入,那么activity视图就提供多个位置
4.根据应用的需求,可以联合fragment和activity来组装2和重组用户界面,在整个周期中,activity视图还是那个视图,这样就不会担心违背了Android系统的activity使用规则,就像同一个界面有两个fragment,这样可以通过选择不同的列表项,activity负责以一个明细的fragment替换另一个明细的fragment。
5.对于两者之间的合作,我们可以立即理解成我们创建一个UIfragment来管理用户的界面,然后再设计一个activity来托管这个UIfragment的实例,托管的理解是,activity在其视图层次里面提供一处位置,用来放置fragment视图,fragment本身没有在屏幕上显示视图的能力,因此只有将他们放置到activity的视图的层次结构中,fragment视图才会显示在屏幕上面去,而fragment的作用与activity的作用差不多,都负责创建和管理用户界面和对模型对象进行交互
6.正常的activity视图由FrameLayout组件组成,FrameLayout组件为fragment视图安排了位置
7.对于fragment来说,它有两种,一种是原生版本,一种是支持库版本,我们现在基本用的是支持库的
8.UUID是Android框架的一个Java工具类,有了它,我们就可以产生唯一的ID值,在构造方法里面调用UUID。randomUUTD()方法产生一个随机唯一的ID值,而在使用Date类的时候,我们要使用Java.util.Date这个
9.为了托管UIfragment,activity必须在其布局方面为fragment视图安排位置和管理fragment实例的生命周期,而fragment的生命周期也是具有停止,暂停和运行的状态,fragment也需要有向相应的生命周期来处理activity的工作,fragment的生命周期和activity的生命周期有不同之处就是fragment的生命周期是由托管activity而不是操作系统调用的,操作系统不关心activity用来管理视图的fragment,fragment的使用是activity内部的事情
9onCreate(Bundle),onAttach(Context),onCreateView()-->onActivityCreated(Bundle)-->onStart()-->onResume()-->onPause-->onStop()-->onDestroyView()-->onDestry(),onDetach()
10.activity托管fragment有两种方法,一是在布局中添加,二是在activity中用代码来添加,正常情况下,为了追求真正的灵活UI设计,就必须通过代码来添加fragment,它可以动态控制fragment的方式,何时添加fragment然后完成何种具体的任务也是由自己的决定的,这也可以移除fragment,用其他fragment来代替当前的fragment
11.托管activity布局可以定义多个容器视图,它本身也可以挺复杂的。
12.创建UIfragment步骤有(1)定义用户的布局文件(2)创建fragment类并设置其视图为定义的布局(3)编写代码来实例化组件
13.在创建代码时候,要让这个fragment类去继承Fragment(v4.app的),也是继承支持库的,在fragment中许多工作都是在fragment的生命周期来完成的
14.Fragment的onCreate()方法是公共方法,而activity的方法是受保护方法,因为fragment的方法在它的activity需要调用到它,fragment的视图并没有在onCreate()方法中生成,虽然fragment的实例在onCreate()中配置,但是创建和配置1fragment视图是在onCreateView()中完成的
public View onCreateView(LayoutInflater inflater,ViewGroup cotainer,Bundle bundle);
该方法实例化fragment视图的布局,然后将实例化的View返回给托管的activity,如下面
public View onCreateView(layoutInflater inflater,ViewGroup container,Bundle bundle) {
View v = ifflater.inflate(R.layout.fragment_crime,cotainer,false);
return v;
}
fragment的视图通过调用LayoutInflater.inflater()方法来传入布局资源的,第二个参数是视图的父视图,我们通常选父视图来配置组件,第三个是用来告诉布局生产器是不是要将生成的视图添加给父视图,这里传入false,说明我们要将代码的形式添加视图,实例化组件也是在上面的方法中实例化的
对比于activity,fragment需要调用View.findViewById(int)方法,activity是调用findViewById()方法,因为它可以在后台电泳。而Fragment没有对应的方法,只能手动来调用。
15.向FragmentManager添加UIfragment,
activity类中相应添加了FragmentManager类,FragmentManager类负责管理fragment并将他们的视图添加到activity的视图中去,FragmentManager管理fragment队列和fragment事务队列回退栈。
要将代码的形式把fragment添加给activity,那么就要直接调用activity的FragmentManager,在托管的activity中,去获得FragmentManager,那么就需要在activtiyd的onCreate()方法中去调用下面的句子
FragmentManager fm = getSupportFragmentManager();
16.获得一个FragmentManager后就需要获取一个fragment交给它管理,如下面的代码
Fragment fragment = fm.findFragmentById(R.id.fragment_cotainer);
if(fragment == null){
fragment = new CrimeFragment();
fm.beginTransaction()
.add(R.id.fragment_cotainer,fragment)
.commit();
}
上面的R.id.fragment_cotainer是activtiy中为fragment所留的位置的id,而CrimeFragment是我们自定义的碎片
FragmentManager使用FrameLayout组件的资源ID来识别CremeFragment,这样的话如果想要向activtiy中添加多个fragment,那么就需要为每一个fragment来创建不同的ID的不同容器
上面的第一句代码,它是先使用资源ID来向FragmentManager请求并获取fragment,如果要获取的fragment在队列,那么就直接返回它(针对屏幕旋转然后重建时的用处)
17.fragment的生命周期,在activtiy的FragmentManager负责调用fragment的生命周期(1)当添加fragment供FragmentManager管理时,onAttach(Context),onCreate(),onCreateView()就会调用(2)托管的activity的onCreate(Bundle)方法执行后,onActivityCreated()方法就会调用,(3)而在fragment处于运行时,添加fragment后,FragmentManager立即驱赶fragment,调用一系列必要的生命周期,快速赶上activity的步骤,如向运行时的activity添加fragment时,依次调用onAttach(),onCreate(),onCreateView(),onActivtiyCreated(),onStart(),以及onResume();一旦调用activity的Fragment就会边接受操作系统的调用的指令,让fragment和activity的状态取得一致。
18.如果想要使用许多零碎的小组件,那么可以使用定制的视图(使用View的子类)
19.如果要使用支持库的fragment,那么应用的activtiy必须继承FragmentActivity,使用AppCompat库