首先贴出使用show/hidden的方式切换fragment代码如下:
//管理Fragment的栈
public void addFragmentStack(int position) {
// FragmentTransaction ft= getFragmentManager()
.beginTransaction();
Fragment fragment = fragments.get(position);
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);
ft.addToBackStack(null);
ft.commit();
}
返回直接调用popBackStack()方法:
getFragmentManager().popBackStack();
总结://在replace情况下,如果不添加ft.addToBackStack(null);这一句代码,那么fragment只在首次进入的时候会走生命周期,以后都不会走生命周期了。记得在commit之前添加哦。
//而在show/hide情况下,就算添加了addToBackStack代码,fragment在第二次进入的时候,总是不会走生命周期方法。
show/hidden的好处是可以记忆保存fragment上一次执行后的状态,但是在需要及时刷新fragment数据的需求上,明显不能满足我们的需求了。此时,我们可以继承onHiddenChanged来做,具体代码如下:
@Override
public void onHiddenChanged(boolean hidden) {
// TODO Auto-generated method stub
super.onHiddenChanged(hidden);
if(!hidden){
//如果当前fragment显示了,即处于当前,你就可以做自己想要的逻辑处理了。
}
}