首先贴出利用show/hidden方式切换fragment的代码:
//管理Fragment的栈,参数position表示fragment的角标
public void addFragmentStack(int position) {
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
if (!fragment.isAdded()) {
ft.add(R.id.fl_guanzhu, fragment);//fl_guanzhu是代表的FrameLayout
}
for (int i = 0; i < fragments.size(); i++) {
if (i == position) {
ft.show(fragments.get(i));
} else {
ft.hide(fragments.get(i));
}
}
ft.commit();
}
然后再贴出replace方式切换fragment的代码:
private void ReplaceFragmentMethod(int position) {
FragmentTransaction tration = getFragmentManager() .beginTransaction();
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = fragments.get(position);
ft.replace(R.id.fl_guanzhu, fragment);//fl_guanzhu是代表的FrameLayout
ft.addToBackStack(null);
ft.commit();
}
返回直接调用popBackStack()方法如下:
getFragmentManager().popBackStack();
总结://在replace情况下,如果不添加 ft.addToBackStack(null);这一句代码,那么fragment只在首次进入的时候会走生命周期,以后都不会走生命周期了。记得在commit之前添加哦。
//而在show/hide情况下,就算添加了addToBackStack代码,fragment在第二次进入的时候,总是不会走生命周期方法。
show/hidden的好处是可以记忆保存fragment上一次运行后的状态,不好处就是如果在需要及时刷新数据的需求下,显然实现不了。不用怕,我们可以继承onHiddenChanged,代码如下:
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if(!hidden){
}
}