Fragment 总结

转载自:http://www.jianshu.com/p/f687ef9a96cc

Fragment是activity的界面中的一部分或一种行为:

你可以把多个Fragment组合到一个activity中来创建一个多面界面并且你可以在多个activity中重用一个Fragment。你可以把Fragment认为模块化的一段activity,它具有自己的生命周期,接收它自己的事件,并可以在activity运行时被添加或删除。

Fragment不能独立存在,它必须嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影响:

例如:当activity暂停时,它拥有的所有的Fragment都暂停了,当activity销毁时,它拥有的所有Fragment都被销毁。然而,当activity运行时(在onResume()之后,onPause()之前),你可以单独地操作每个Fragment,比如添加或删除它们。当你在执行上述针对Fragment的事务时,你可以将事务添加到一个棧中,这个栈被activity管理,栈中的每一条都是一个Fragment的一次事务。有了这个栈,就可以反向执行Fragment的事务,这样就可以在Fragment级支持“返回”键(向后导航)。

当向activity中添加一个Fragment时,它须置于ViewGroup控件中,并且需定义Fragment自己的界面。你可以在layoutxml文件中声明Fragment,元素为:<fragment>;也可以在代码中创建Fragment,然后把它加入到ViewGroup控件中。然而,Fragment不一定非要放在activity的界面中,它可以隐藏在后台为actvitiy工作。

Fragment必须被写成可重用的模块:

因为fragment有自己的layout,自己进行事件响应,拥有自己的生命周期和行为,所以你可以在多个activity中包含同一个Fragment的不同实例(PS:对屏幕适配非常重要)

Activity与Fragment比较,如下图:


生命周期如下图:


几个现成的Fragment的派生类:

DialogFragment
显示一个浮动的对话框。使用这个类创建对话框是替代activity创建对话框的最佳选择.因为你可以把fragmentdialog放入到activity的返回栈中,使用户能再返回到这个对话框。
ListFragment
显示一个列表控件,就像ListActivity类,它提供了很多管理列表的方法,比如onListItemClick()方法响应click事件。
PreferenceFragment
显示一个由Preference对象组成的列表,与PreferenceActivity相同。它用于为程序创建“设置”activity。

fragment添加用户界面:

fragment一般作为activity的用户界面的一部分,把它自己的layout嵌入到activity的layout中。一个
要为fragment提供layout,你必须实现onCreateView()回调方法,然后在这个方法中返回一个View对象,这个对象是fragment的layout的根。
要从onCreateView()方法中返回layout对象,你可以从layoutxml中生成layout对象。为了帮助你这样做,onCreateView()提供了一个LayoutInflater对象。
如下面代码:

public static class  MainFragment   extends  Fragment{   
    @Override   
    public  View  onCreateView(LayoutInflater inflater,ViewGroup container,Bundlesaved InstanceState){   
        //Inflate the layout for this fragment   
        return  inflater.inflate(R.layout.fragment,container,false);   
    }   
 }

//container是存放fragment的layout的ViewGroup对象
//savedInstanceState参数是一个Bundle

Inflate()方法有三个参数:

1.layout的资源ID。
2.存放fragment的layout的ViewGroup。
3.布尔型数据表示是否在创建fragment的layout期间,把layout附加到container上(在这个例子中,因为系统已经把layout插入到container中了,所以值为false,如果为true会导至在最终的layout中创建多余的ViewGroup)

管理fragment:

要管理fragment,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager()。

1.使用方法findFragmentById()或findFragmentByTag(),获取activity中已存在的fragment。
2.使用方法popBackStack()从activity的后退栈中弹出fragment
3.用方法addOnBackStackChangedListerner()注册一个侦听器以监视后退栈的变化。

通过FragmentManager来取得FragmentTransaction的实例。以便执行事务:

FragmentManager  fragmentManager=getFragmentManager(); 
 FragmentTransaction  fragmentTransaction=fragmentManager.beginTransaction();

最后使用commit()方法提交事务。

事务中动作的执行顺序可随意,但要注意以下两点:

1.你必须最后调用commit()。
2.如果你添加了多个fragment,那么它们的显示顺序跟添加顺序一至(后显示的覆盖前面的)。

注意:

调用commit()后,事务并不会马上执行。它会在activity的UI线程(其实就是主线程)中等待直到线程能执行的时候才执行(废话)。如果必要,你可以在UI线程中调用executePendingTransactions()方法来立即执行事务。但一般不需这样做,除非有其它线程在等待事务的执行。你只能在activity处于可保存状态的状态时,比如running中,onPause()方法和onStop()方法中提交事务,否则会引发异常。这是因为fragment的状态会丢失。如果要在可能丢失状态的情况下提交事务,请使用commitAllowingStateLoss()。



文/木木木_木头脑袋(简书作者)
原文链接:http://www.jianshu.com/p/f687ef9a96cc
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值