fragment 用法小结

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(添加或者删除它们)

  1. 当一个fragment被创建的时候,调用的方法:

    onAttach()
    onCreate()
    onCreateView()
    onActivityCreated()

  2. 当这个fragment对用户可见的时候,调用方法:

    onStart()
    onResume()

  3. 当这个fragment进入“后台模式”的时候,调用方法:

    onPause()
    onStop()

  4. 当这个fragment被销毁了(或者持有它的activity被销毁了),调用方法:

    onPause()
    onStop()
    onDestroyView()
    onDestroy()
    onDetach()

  5. 就像activitie一样,以下的方法可以使用Bundle对象保存一个fragment的对象.

    onCreate()
    onCreateView()
    onActivityCreated()

  6. 区别于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的关联删除后返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值