Android的Fragment

一、Fragment的产生与介绍

Android 运行在各类各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。针对屏幕尺寸的差距,不少状况下,都是先针对手机开发一套App,而后拷贝一份,修改布 局以适应平板神马超级大屏的。难道没法作到一个App能够同时适应手机和平板么,固然了,必须有啊。Fragment的出现就是为了解决这样的问题。你能够把Fragment当成Activity的一个界面的一个组成部分,甚至Activity的界面能够彻底有不一样的Fragment组成,更帅气的是 Fragment拥有本身的生命周期和接收、处理用户的事件,这样就没必要在Activity写一堆控件的事件处理的代码了。更为重要的是,你能够动态的添 加、替换和移除某个Fragment。android

二、Fragment的生命周期app

Fragment必须是依存与Activity而存在的,所以Activity的生命周期会直接影响到Fragment的生命周期。官网这张图很好的说明了二者生命周期的关系:ide

onAttach(Activity)
当Fragment与Activity发生关联时调用。
onCreateView(LayoutInflater, ViewGroup,Bundle)
建立该Fragment的视图
onActivityCreated(Bundle)
当Activity的onCreate方法返回时调用
onDestoryView()
与onCreateView想对应,当该Fragment的视图被移除时调用
onDetach()
与onAttach相对应,当Fragment与Activity关联被取消时调用
注意:除了onCreateView,其余的全部方法若是你重写了,必须调用父类对于该方法的实现。布局

三、静态的使用Fragmentspa

这是使用Fragment最简单的一种方式,把Fragment当成普通的控件,直接写在Activity的布局文件中。步骤:继承

一、继承Fragment,重写onCreateView绑定Fragemnt的布局。接口

二、在Activity中声明此Fragment,就当和普通的View同样。生命周期

把Fragment当成普通的View同样声明在Activity的布局文件中,而后全部控件的事件处理等代码都由各自的Fragment去处理,瞬间以为Activity好干净,代码的可读性、复用性以及可维护性是否是瞬间提高了。事件

四、动态的使用Fragment,先静态的实现Fragment,经过事务进行替换或者删除的增长。事务

五、app包中的Fragment和v4包下的Fragment的区别

一、尽可能不要用app包中的fragment,由于这个是在3.0以后才有的,支持的版本过高,在低版本中是是用不了的
二、android.support.v4.app.Fragment:能够兼容到1.6的版本。
三、关于这两个fragment使用<fragment>标签的问题
 (1)app.fragment和v4.fragment都是可使用<fragment>标签的
      只是在在使用的时候若是是app.fragment则没有什么特殊的地方继承Activity便可。
 (2)当v4.fragment使用<fragment>标签的时候就要特别注意了:
当这个Activity的布局中有<fragment>标签的时候,这个Activity必须继承
FragmentActivity,不然就会报错.此时若是不继承FragmentActivity的话 编译系统会把<fragment>认为是app包中的Fragment来处理。可是此时咱们导入的是v4包中的Fragment。

(3)app包中关于Fragment的类和方法在V4包中都是有相应的对应的

六、

Fragment家族经常使用的API

Fragment经常使用的三个类:

android.app.Fragment 主要用于定义Fragment

android.app.FragmentManager 主要用于在Activity中操做Fragment

android.app.FragmentTransaction 保证一些列Fragment操做的原子性,熟悉事务这个词,必定能明白~

a、获取FragmentManage的方式:

getFragmentManager() // v4中,getSupportFragmentManager

b、主要的操做都是FragmentTransaction的方法

FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

transaction.add() 

往Activity中添加一个Fragment

transaction.remove()

从Activity中移除一个Fragment,若是被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。

transaction.replace()

使用另外一个Fragment替换当前的,实际上就是remove()而后add()的合体~

transaction.hide()

隐藏当前的Fragment,仅仅是设为不可见,并不会销毁

transaction.show()

显示以前隐藏的Fragment

detach()

会将view从UI中移除,和remove()不一样,此时fragment的状态依然由FragmentManager维护。

attach()

重建view视图,附加到UI上并显示。

transatcion.commit()//提交一个事务

7.管理Fragment回退栈

相似与Android系 统为Activity维护一个任务栈,咱们也能够经过Activity维护一个回退栈来保存每次Fragment事务发生的变化。若是你将 Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存的Fragment。一旦Fragment彻底从后退栈中弹出,用户再次点 击后退键,则退出当前Activity。用FragmentTransaction.addToBackStack(String),将当前的事务添加到退回栈,replace是remove和add的合体,而且若是不添加事务到回退栈,前一个Fragment实例会被销毁。

8.Fragment与Activity通讯

由于全部的Fragment都是依附于Activity的,因此通讯起来并不复杂,大概概括为:

a、若是你Activity中包含本身管理的Fragment的引用,能够经过引用直接访问全部的Fragment的public方法

b、 若是Activity中未保存任何Fragment的引用,那么不要紧,每一个Fragment都有一个惟一的TAG或者ID,能够经过 getFragmentManager.findFragmentByTag()或者findFragmentById()得到任何Fragment实 例,而后进行操做。

c、在Fragment中能够经过getActivity获得当前绑定的Activity的实例,而后进行操做。

注:若是在Fragment中须要Context,能够经过调用getActivity(),若是该Context须要在Activity被销毁后还存在,则使用getActivity().getApplicationContext()。

9.Fragment与Activity通讯经常使用的通讯方法

在Fragment中定义回调的接口,Activity中实现Fragment的接口实现他的方法。

10.Fragmeny与ActionBar和MenuItem集成

Fragment能够添加本身的MenuItem到Activity的ActionBar或者可选菜单中。

a、在Fragment的onCreate中调用 setHasOptionsMenu(true);

b、而后在Fragment子类中实现onCreateOptionsMenu

c、若是但愿在Fragment中处理MenuItem的点击,也能够实现onOptionsItemSelected;固然了Activity也能够直接处理该MenuItem的点击事件。

11.没有布局的Fragment的做用

没有布局文件Fragment其实是为了保存,当Activity重启时,保存大量数据准备的

相关文章
相关标签/搜索