众所周知,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的回退栈由系统管理。