在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常挂掉
网上说使用replace切换会使被切换的Fragment给替换掉,从而被被切换的Fragment的view从viewtree中删除,致使切换过程中每次都要重新创建Fragment
每次使用add添加Fragment,当再次切换到时用show显示,而被切换的Fragment用hide隐藏,具体代码如下:
/** * Fragment跳转 * @param fm * @param fragmentClass * @param tag * @param args */ public void turnToFragment(Class<? extends Fragment> fromFragmentClass, Class<? extends Fragment> toFragmentClass, Bundle args) { FragmentManager fm = getSupportFragmentManager(); //被切换的Fragment标签 String fromTag = fromFragmentClass.getSimpleName(); //切换到的Fragment标签 String toTag = toFragmentClass.getSimpleName(); //查找切换的Fragment Fragment fromFragment = fm.findFragmentByTag(fromTag); Fragment toFragment = fm.findFragmentByTag(toTag); //如果要切换到的Fragment不存在,则创建 if (toFragment == null) { try { toFragment = toFragmentClass.newInstance(); toFragment.setArguments(args); } catch (java.lang.InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } //如果有参数传递, if( args != null && !args.isEmpty() ) { toFragment.getArguments().putAll(args); } //Fragment事务 FragmentTransaction ft = fm.beginTransaction(); //设置Fragment切换效果 ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out); /** * 如果要切换到的Fragment没有被Fragment事务添加,则隐藏被切换的Fragment,添加要切换的Fragment * 否则,则隐藏被切换的Fragment,显示要切换的Fragment */ if( !toFragment.isAdded()) { ft.hide(fromFragment).add(R.id.content_frame, toFragment, toTag); } else { ft.hide(fromFragment).show(toFragment); } //添加到返回堆栈 // ft.addToBackStack(tag); //不保留状态提交事务 ft.commitAllowingStateLoss(); }
这里有个FragmentTransaction(事务),这个是Fragment切换的核心类,它有两个方法:replace,add,一个是替 换Fragment,一个是添加Fragment,两者的区别是:replace=remove掉旧fragment,add新的fragment,
当我们的应用(即管理多个Fragment的Activity)运行到后台时(即推出当前屏幕),会触发Activity的onPause()方 法,而Activity的onPause()会调用它所管理的Fragment的同样的方法,但是当我使用replace时,已经remove掉了原来的 Fragment,所以当调用原理的Fragment的onPause()方法就回不粗在,就会出现上述xxx is not currently in the FragmentManager的异常推出,有debug为证: