fragment,是从fragment或它的派生类的子类。fragment生命周期如下:![GitHub set up](/Users/xiaowenli/Desktop/1354170699_6619.png
)
Fragment是activity的界面中的一部分或一种行为,fragment具有自己的生命周期,接受它自己的事件,并可以在activity运行时被添加或者删除。
Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受到所在的activity的影响。例如:当activity暂停时,它拥有的所有Fragment都暂停了,当activity销毁时,它所拥有的所有Fragment们全被销毁。当activity运行时,可以单独的操作每个Fragment(添加或者删除它们)
当一个fragment被创建的时候,调用的方法:
onAttach()
onCreate()
onCreateView()
onActivityCreated()
当这个fragment对用户可见的时候,调用方法:
onStart()
onResume()
当这个fragment进入“后台模式”的时候,调用方法:
onPause()
onStop()
当这个fragment被销毁了(或者持有它的activity被销毁了),调用方法:
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
就像activitie一样,以下的方法可以使用Bundle对象保存一个fragment的对象.
onCreate()
onCreateView()
onActivityCreated()
区别于activity状态
onAttached()
—— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
onCreateView()
—— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
onActivityCreated()
—— 当activity的onCreated()方法返回后调用此方法
onDestroyView()
—— 当fragment中的视图被移除的时候,调用这个方法。
onDetach()
—— 当fragment和activity分离的时候,调用这个方法。
当执行针对Fragment的事务时,可以将事务添加到一个棧中,这个栈被activity管理,栈中的每一条都是一个Fragment的一次事务。有了这个栈,就可以反向执行Fragment的事务,这样就可以在Fragment级支持“返回”键(向后导航)。
当向activity中添加一个Fragment时,它须置于ViewGroup控件中,并且需定义Fragment自己的界面。你可以在layoutxml文件中声明Fragment,元素为:;也可以在代码中创建Fragment,然后把它加入到ViewGroup控件中。然而,Fragment不一定非要放在activity的界面中,它可以隐藏在后台为actvitiy工作。
Android从3.0开始引入fragment,主要是为了支持更灵活的界面设计,比如在平板上的应用。Fragment不需应付view树中复杂的变化。通过把activity的layout分成fragment,你可以在activity运行时改变它的样子,并且可以在activity的后退栈中保存这些改变。
Fragment必须被写成可重用的模块。因为fragment有自己的layout,自己进行事件响应,拥有自己的生命周期和行为,所以可以在多个activity中包含同一个Fragment的不同实例。这对于界面在不同的屏幕尺寸下都能给用户完美的体验尤其重要。比如可以在程序运行于大屏幕中时启动包含很多fragment的activity,而在运行于小屏幕时启动一个包含少量fragment的activity。( 这段时引用的,暂时还没有遇到这个问题)
fragment一般作为activity的用户界面的一部分,把它自己的layout嵌入到activity的layout中。
要为fragment提供layout,必须实现onCreateView()回调方法,然后在这个方法中返回一个View对象,这个对象是fragment的layout的根。
如果你的fragment是从ListFragment中派生的,就不需要实现onCreateView()方法了,因为默认的实现已经为你返回了ListView控件对象。
要从onCreateView()方法中返回layout对象,可以从layoutxml中生成layout对象。为了帮助你这样做,onCreateView()提供了一个LayoutInflater对象。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.home_fragment, container, false);
}
onCreateView()参数中的container是存放fragment的layout的ViewGroup对象。savedInstanceState参数是一个Bundle,跟activity的onCreate()中Bundle差不多,用于状态恢复。
Inflate()
方法有三个参数:
1. layout的资源ID。
2. 存放fragment的layout的ViewGroup。
3. 布尔型数据表示是否在创建fragment的layout期间,把layout附加到container上(在这个例子中,因为系统已经把layout插入到container中了,所以值为false,如果为true会导至在最终的layout中创建多余的ViewGroup)。
把Fragment添加到Activity中
在代码中添加fragment到一个ViewGroup
我们可以在运行时,把fragment添加到activity的layout中。只需指定一个要包含fragment的ViewGroup。为了完成fragment的事务(比如添加,删除,替换等),必须使用FragmentTransaction的方法。你可以从activity获取到FragmentTransaction,如下:
FragmentManager fragmentManager = getFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
使用add()方法添加一个fragment
*Fragment fragment =new *Fragment();
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTransaction.commit();
使用add()加入fragment时将触发onAttach(),使用attach()不会触发onAttach(),而使用detach()会将view从viewtree中删除,和remove()不同,此时fragment的状态依然保持着,在使用attach()时会再次调用onCreateView()来重绘视图,注意使用detach()后fragment.isAdded()方法将返回false,在使用attach()还原fragment后isAdded()会依然返回false(需要再次确认)
执行detach()和replace()后要还原视图的话, 可以在相应的fragment中保持相应的view,并在onCreateView()方法中通过view的parent的removeView()方法将view和parent的关联删除后返回