背景介绍
平板项目中使用Fragment做页面,而且还要用Fragment做次级页面的跳转,点击返回按钮,可以返回上一个页面。次级页面下钻层级不确定,但是界面相同,也就是说Fragment可以被复用
解决思路
- 使用回退栈管理
- 控制FragmentManager的show()和hide()方法来实现
回退栈
**childFragment.java**
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
//添加到回退栈
ft.addToBackStack("null");
**在MainActivity.java**
/**
* 手动回退
*/
public void popBackStack(){
if (fragmentManager.getBackStackEntryCount()>0){
fragmentManager.popBackStack();
}else {
finish();
}
}
@Override
public void onBackPressed() {
// super.onBackPressed();屏蔽掉系统的返回事件
popBackStack();
}
Fragement 逐层创建
Activity.java(Activity页面添加Fragment1)
注意这里使用的是replace方法
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.frame_content, StatisticFragment.newInstance(sTiem,eTime),"1");//这是第一个Fragment
ft.commit();
Fragment1.java(第一级Fragment,添加Fragment2.class)
注意这里使用的是add方法
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.add(R.id.frame_content, SubStatisticFragment.newInstance(subParamsBundle("2",dqbh,bjqf),3),2+"");
ft.hide(getActivity().getSupportFragmentManager().findFragmentByTag(1+""));
ft.addToBackStack(null);//统计回退栈
ft.commit();
Fragment2.java(第二级Fragment页面,添加Fragment3.class)
这里也是用的add
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
paramsBundle.putString("bjqf",bjqf);
ft.add(R.id.frame_content, SSubStatisticFragment.newInstance(paramsBundle,tag+1),tag+"");
ft.addToBackStack("null");//统计回退栈
ft.hide(getActivity().getSupportFragmentManager().findFragmentByTag(tag-1+""));
ft.commit();
说明
为什么第一个fragment在添加的时候用的是replace而不是add?
防止回退到首页的时候显示Activity的空的FrameLayout为什么在Fragment中创建Fragment的时候用add而不是Replace?
因为使用replace方法添加新的Fragment在回退的时候Fragment会重新加载- 为什么要调用hide方法
隐藏上一个Fragment防止页面重叠