Android_Fragment的生命周期与返回栈BackStack

时间:2015-05-05 19:22:44   收藏:0   阅读:10094

一、Fragment的生命周期初探

因为Fragment必须嵌入在Acitivity中使用,所以Fragment的生命周期和它所在的Activity是密切相关的。

如果Activity是暂停状态,其中所有的Fragment都是暂停状态;如果Activity是stopped状态,这个Activity中所有的Fragment都不能被启动;如果Activity被销毁,那么它其中的所有Fragment都会被销毁。

但是,当Activity在活动状态,可以独立控制Fragment的状态,比如加上或者移除Fragment。

当这样进行fragment transaction(转换)的时候,可以把fragment放入Activity的back stack中,这样用户就可以进行返回操作。

使用Fragment时,需要继承Fragment或者Fragment的子类(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代码看起来和Activity的类似。

每当创建一个Fragment时,首先添加以下三个回调方法:

将Fragment加载到Activity当中有两种方式:

第一种方式虽然简单但灵活性不够。添加Fragment到Activity的布局文件当中,就等同于将Fragment及其视图与activity的视图绑定在一起,且在activity的生命周期过程中,无法切换fragment视图。

第二种方式比较复杂,但也是唯一一种可以在运行时控制fragment的方式(加载、移除、替换)。

二、Fragment与Activity的生命周期对比

 

技术分享技术分享

 

fragment生命周期示例

初次加载:(分成两部分来看)

技术分享

技术分享

点击一下home键(或接入电话),打印日志如下:

技术分享

重新进入进入程序(或电话结束),打印日志如下:

技术分享

点击back键退出程序,打印日志如下:

技术分享

通过上面的日志,我们能够看出,Fragment和Activity的生命周期太相似了。只是有几个Activity中没有的新方法,需要重点介绍一下:

三、Fragment返回栈的管理

将Fragment添加到返回栈中:

假设现在我们有两个Fragment:Fragment01和Fragment02,我们现在从Fragment01的界面跳到 Fragment02,然后按Back键,发现程序是直接退出了,而不是返回到Fragment01。如果现在想实现以下功能:从Fragment01的 界面跳到Fragment02,然后按Back键,会返回到Fragment01。这个功能该怎么实现呢?这其实就利用到了返回栈的知识。

其实很简单,FragmentTransaction中提供了一个addToBackStack()方法,可以将一个事务添加到返回栈中。

我们先回顾一下之前动态加载Fragment的代码,然后在此基础之上,增加一行代码就可以将Fragment添加到返回栈中:(即第07行代码)

//步骤一:添加一个FragmentTransaction的实例
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//步骤二:用add()方法加上Fragment的对象
RightFragment rightFragment = new RightFragment();
transaction.add(R.id.right, rightFragment);
transaction.addToBackStack(null);
//步骤三:调用commit()方法使得FragmentTransaction实例的改变生效 transaction.commit();

我们在事务提交之前调用了FragmentTransaction的addToBackStack()方法,它可以接受一个名字用于描述返回栈的状态,一般传入null即可。

 

例子

@Override
     public void onClick(View v) {
         // TODO Auto-generated method stub
 transaction = manager.beginTransaction(); 47         switch (v.getId()) {
         case R.id.button1:
             Fragment01 fragment01 = new Fragment01();
             transaction.replace(R.id.right, fragment01, "fragment01");
             transaction.addToBackStack("fragment01");// 添加到Activity管理的回退栈中。
             break;
 
         case R.id.button2:
             Fragment02 fragment02 = new Fragment02();
             transaction.replace(R.id.right, fragment02, "fragment02");
             transaction.addToBackStack("fragment02");// 添加到Activity管理的回退栈中。
             break;
 
         case R.id.button3:
             Fragment03 fragment03 = new Fragment03();
             transaction.replace(R.id.right, fragment03, "fragment03");
             transaction.addToBackStack("fragment03");// 添加到Activity管理的回退栈中。
             break;

         }
  transaction.commit();      
     }

 

运行程序后,界面如下,没有任何fragment被加载:

点击按钮加载fragment01:

技术分享

点击按钮加载fragment02(此时fragment01被替换,并被压到了栈当中):

技术分享

注:如果fragment01在替换的时候没有被压到栈中,那就会被销毁,在执行完onDestroyView()方法后,会继续执行onDestroy()和onDetach()方法。

按Back键,fragment01重新返回到屏幕:(fragment02被销毁)

技术分享

再按Back键,fragment01被销毁:

技术分享

注:Fragment的返回栈由Activity管理;而Activity的返回栈由系统管理。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!