【Android学习笔记】 碎片Fragment(1)

看了大神鸿洋_的讲解,对Fragment有中提醐灌顶的美妙感觉。

http://blog.csdn.net/lmj623565791/article/details/37970961

http://blog.csdn.net/lmj623565791/article/details/37992017

http://blog.csdn.net/lmj623565791/article/details/42628537

---------------------------------------------------------------------------------

1.碎片Fragment是什么 ?

  •    嵌入在活动当中的UI片段
  •    可理解为:一个迷你型的活动
  •    作用:大小屏幕适配;竖屏横屏切换;

2.碎片的生命周期

  1. onAttach()               //当一个Fragment对象关联到一个Activity时调用。
  2. onCreate()               //初始创建Fragment对象时调用。
  3. onCreateView()        //创建与Fragment对象关联的View视图时调用。
  4. onActivityCreated()  //Activity对象完成自己的onCreate方法时调用。
  5. onStart()        //Fragment对象在ui可见时调用。
  6. onResume()   //Fragment对象的ui可以与用户交互时调用。
  7. onPause()   //Fragment对象可见,但不可交互。有Activity对象转为onPause状态时调用。
  8. onStop()     //有空间完全遮挡;或者宿主Activity对象转为onStop状态时调用。
  9. onDestroyView()  //Fragment对象清理view资源时调用,也就是移除fragment中的视图。
  10. onDestroy()         //Fragment对象完成对象清理View资源时调用。
  11. onDetach()          //Fragment对象没有与Activity对象关联时调用。
  • 当一个fragment被创建的时候执行1-4;
  • 当这个fragment创建完毕,到对用户可见的时候,执行5-6;
  • 当这个fragment从可见到不可见时,执行7-8;
  • 当这个fragment被销毁了(或者持有它的activity被销毁了),执行9-11;
  • 另外在3-5,可以使用Bundle对象保存一个fragment的对象。



1. 当一个fragment被创建的时候,它会经历以下状态.

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

2. 当这个fragment对用户可见的时候,它会经历以下状态。

  • onStart()
  • onResume()

3. 当这个fragment进入“后台模式”的时候,它会经历以下状态。

  • onPause()
  • onStop()

4. 当这个fragment被销毁了(或者持有它的activity被销毁了),它会经历以下状态。

  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy() // 本来漏掉类这个回调,感谢xiangxue336提出。
  • onDetach()

5. 就像activitie一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。

  • onCreate()
  • onCreateView()
  • onActivityCreated()

6. fragments的大部分状态都和activitie很相似,但fragment有一些新的状态。

  • onAttached() —— 当fragment被加入到activity时调用(在这个方法中可以获得所在的activity)。
  • onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。
  • onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法
  • onDestroyView() —— 当fragment中的视图被移除的时候,调用这个方法。
  • onDetach() —— 当fragment和activity分离的时候,调用这个方法。

一旦activity进入resumed状态(也就是running状态),你就可以自由地添加和删除fragment了。因此,只有当activity在resumed状态时,fragment的生命周期才能独立的运转,其它时候是依赖于activity的生命周期变化的。


3.动态添加碎片(碎片真正强大之处)

  • step1.创建待添加的碎片实例;
  • step2.获取到FragmentManager,在活动中可以直接调用getFragmentManager()方法得到;
  • step3.开启一个事务,通过调用beginTransaction()方法开启;
  • step4.向容器内加入碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例;‘
  • step5.提交食物,调用commit()方法来完成;

4Fragment .vs Activity

  • 生命周期对比:


  •      Activity是Context的继承,而fragment是Object的继承;

         public class Fragment extends Object implements ComponentCallbacks2 View.OnCreateContextMenuListener

  •      Fragment有一个bundle可以存贮数据,和activity类似,
  •      在创建时进行初始化调用,此外还有一个bundle用于保存现有状态,在onCreate(),onInflate(),onCreateView() 和onActivityCreated()都指向该对象。
  •      一个activity可以显示多个fragment,如果fragment A被fragment B替代,则fragment A会被放入返回栈back stack中,用户按返回键时,可以重新显示fragment A。
  •      一个fragment具有一个tag和一个ID,可用于索引

5.Fragment与Activity之间的通信

  • 如何在活动中调用相应碎片?

          Fragment1 fragment = (Fragment1)getFragmentManager().findFragmentById(R.id.xxx_fragment);        //FragmentManager提供了类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例

  • 如何在碎片中调用活动里的方法?

            MainActivity activity = (MainActivity)getActivity();  //在每个碎片中都可以通过调用getActivity()方法来得到和当前碎片相关联的活动实例;

  • 碎片和碎片通信:

            首先在一个碎片中可以得到与它相关联的活动,然后再通过这个活动去获取另外一个碎片的实例,这样也就实现了不同碎片之间的通信功能。

 6.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()//提交一个事务

注意:常用Fragment的哥们,可能会经常遇到这样Activity状态不一致:State loss这样的错误。主要是因为:commit方法一定要在Activity.onSaveInstance()之前调用。


上述,基本是操作Fragment的所有的方式了,在一个事务开启到提交可以进行多个的添加、移除、替换等操作。

值得注意的是:如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。

a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。

b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。

c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。


上述已经介绍完成了Fragment常用的一些方法,相信看完,大家一定清楚了Fragment的产生理由,以及如何使用Fragment,再根据API的讲解,也能明白,曾经为何觉得Fragment会出现一些列乱七八槽的问题,终究是因为没有弄清楚其生命周期。




参考文章:

http://blog.csdn.net/harvic880925/article/details/45013501   大神harvic880925讲的也是超级棒!     

http://blog.csdn.net/qianfu111/article/details/8948110

http://blog.csdn.net/yangyu20121224/article/details/8995025

http://blog.csdn.net/elinavampire/article/details/48688325

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值