fragment的回退栈机制

众所周知,Android开发中Activity的切换是通过出入栈的方式,但是Fragment的切换是采用销毁并重建的方式,但是每次重建都需要再次调用Fragment的OnCreate()方法,这其中就会浪费很多时间,降低效率。那么我们能不能使Fragment同样采用栈的方式来进行切换,提高运行速度呢?答案是肯定的,Fragment为我们提供了回退栈的机制。

使用回退栈的方法非常简单。下面举个例子,有两个Fragment,Fragment1和Fragment2,Fragment2中有一个按钮可以回退到Fragment1。代码如下:

Activity中先初始化Fragment1,但不加入回退栈:

Fragment1 f1 = new Fragment1();
FragmentTransaction ft = getFragmentManager().beginTransaction();
 //fl为占位布局
ft.add(R.id.fl, f1);
ft.commit();
Fragment1的按钮事件将当前事务加入回退栈,跳转到Fragment2:

Fragment2 f2 = new Fragment2();
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.fl, f2);
//将当前的事务添加到了回退栈
ft.addToBackStack(null);
ft.commit();
Fragment2的按钮事件将事务退出回退栈:

FragmentManager fm = new FragmentManager();
fm.popBackStack();

在实际的运行过程中,如果使用了回退栈,在上面的例子中,Fragment1跳转到Fragment2,Fragment1会依次调用了OnPause()、OnStop()、OnDestroyView()方法,但是却不会调用OnDestroy()方法,即只会销毁当前f1的视图,但f1对象没有被销毁,而是存入栈中。Fragment2则会调用OnAttach()、OnCreate()、OnCreateView()等方法。

同时,弹栈的两个方法popBackStack()与popBackStatckImmediate()又有所不同,后者是在内部调用时立即执行。在popBackStack()的同名方法中可以加入参数tag,Id等可以控制弹出那个Fragment。

除此以外,还需注意的一点是:Fragment的回退栈由Activity管理,而Activity的回退栈由系统管理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值