首页 > 代码库 > Fragment保持状态切换
Fragment保持状态切换
在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常挂掉
网上说使用replace切换会使被切换的Fragment给替换掉,从而被被切换的Fragment的view从viewtree中删除,致使切换过程中每次都要重新创建Fragment
每次使用add添加Fragment,当再次切换到时用show显示,而被切换的Fragment用hide隐藏,具体代码如下:
1 /** 2 * Fragment跳转 3 * @param fm 4 * @param fragmentClass 5 * @param tag 6 * @param args 7 */ 8 public void turnToFragment(Class<? extends Fragment> fromFragmentClass, Class<? extends Fragment> toFragmentClass, Bundle args) { 9 10 FragmentManager fm = getSupportFragmentManager();11 //被切换的Fragment标签12 String fromTag = fromFragmentClass.getSimpleName();13 //切换到的Fragment标签14 String toTag = toFragmentClass.getSimpleName();15 //查找切换的Fragment16 Fragment fromFragment = fm.findFragmentByTag(fromTag);17 Fragment toFragment = fm.findFragmentByTag(toTag);18 //如果要切换到的Fragment不存在,则创建19 if (toFragment == null) {20 try {21 toFragment = toFragmentClass.newInstance();22 toFragment.setArguments(args);23 } catch (java.lang.InstantiationException e) {24 e.printStackTrace();25 } catch (IllegalAccessException e) {26 e.printStackTrace();27 }28 }29 //如果有参数传递,30 if( args != null && !args.isEmpty() ) {31 toFragment.getArguments().putAll(args);32 }33 //Fragment事务34 FragmentTransaction ft = fm.beginTransaction();35 //设置Fragment切换效果36 ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,37 android.R.anim.fade_in, android.R.anim.fade_out);38 /**39 * 如果要切换到的Fragment没有被Fragment事务添加,则隐藏被切换的Fragment,添加要切换的Fragment40 * 否则,则隐藏被切换的Fragment,显示要切换的Fragment41 */42 if( !toFragment.isAdded()) {43 ft.hide(fromFragment).add(R.id.content_frame, toFragment, toTag);44 } else {45 ft.hide(fromFragment).show(toFragment);46 }47 //添加到返回堆栈48 // ft.addToBackStack(tag);49 //不保留状态提交事务50 ft.commitAllowingStateLoss();51 }
这里有个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为证:
Fragment保持状态切换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。