在使用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 //查找切换的Fragment
16 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,添加要切换的Fragment
40 * 否则,则隐藏被切换的Fragment,显示要切换的Fragment
41 */
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为证:

android的Fragment切换时怎保存状态,避免重复调用onCreateView()

 

在sdk sample的APIdemo 的FragmentHideShow.java

actionbar+Fragment 来回切换怎保持不了状态

 

生成了 2个 fragment 点击之后就替换 结果 来回切换后后 textview里的内容是随机的? 按理说 creat 就调用一次啊?求解答!

Fragment保持状态切换,fragment状态切换的更多相关文章

  1. Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3364728.html 我前两天写过一篇博客<Android使用Fragment来 ...

  2. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...

  3. Fragment保持状态切换

    在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常 ...

  4. FragmentTabHost切换Fragment时保存状态,避免切换Fragment走onCreateView和onDestroyView方法;

    FragmentTabHost这个控件每次切换Fragment,都会走Fragment的onCreateView和onDestroyView方法,多以每次切换都会创建和销毁Fragment实例,先来看 ...

  5. Android Studio精彩案例(二)《仿微信动态点击底部tab切换Fragment》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 现在很多的App要么顶部带有tab,要么就底部带有tab.用户通过点击tab从而切换不同的页面(大部分情况时去切换fragment). ...

  6. Android控件使用FragmentTabHost,切换Fragment;

    大部分APP的主界面都很类似,要么底部导航的,要么就是侧滑菜单,还有底部导航+侧滑菜单的:底部导航实现大概有几种方式: TabHost+Fragment RadioGroup+Fragment Fra ...

  7. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  8. 使用ViewPager切换Fragment时,防止频繁调用OnCreatView

    使用ViewPager切换Fragment,我原先使用系统自带的适配器FragmentPagerAdapter. 切换fragment时,频繁调用oncreatview(). 查看FragmentPa ...

  9. 让多个Fragment 切换时不重新实例化、FragmentTabHost切换Fragment时避免UI重新加载

    http://www.tuicool.com/articles/FJ7VBb FragmentTabHost切换Fragment时避免UI重新加载 不过,初次实现时发现有个缺陷,每次FragmentT ...

随机推荐

  1. [C++参考]私有成员变量的理解

    私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量. 然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了 ...

  2. Laravel 5.1 ACL权限控制 三 之权限准备及实现权限管理

    请自动参照到上上篇文章 1.创建控制器 php artisan make:model Permission php artisan make:model Role 2.创建表 php artisan ...

  3. Arcengine 开发,FeatureClass新增feature时“The Geometry has no z-value”或"The Geometry has null z-value"的解决方案

    Arcengine 开发,当图层含有Z值时,新增的feature没有Z值就会 出现“The Geometry has no z-value”的错误.意思很明显,新增的geometry没有Z值. 此时按 ...

  4. Qt 错误: 无法运行 release 下的可执行文件

        学习Qt有一点时间了,但之前都是在debug版本下进行编译运行,偶然切换到release版本下,却出现了如下错误: 错误提示:   This application failed to sta ...

  5. Test class should have exactly one public zero-argument constructor

    java.lang.Exception: Test class should have exactly one public zero-argument constructor at org.juni ...

  6. android面试题之二

    六.android 中的动画有哪几种,它们的特点和区别是什么 ? 逐帧动画和补间动画. 逐帧动画:是传统的动画播放方式,指定每一帧的内容和停留时间,然后顺序地播放排列好的图片,类似电影. 补间动画:给 ...

  7. javascript特效:会随着鼠标而动的眼睛

    这个特效非常简单,其中眼球和眼珠都是特定的图片.只要掌握好距离坐标就没问题.我就直接贴代码,有兴趣的朋友可以自己复制下来运行一下,下面的眼睛图像就是我的文件用到的图像,比较难看..我就把我的代码贴出来 ...

  8. 你喜欢SOAP吗?反正我不喜欢!

    叫什么Simple Object Access Protocol,实际上一点都不Simple! 说什么轻量级协议,从它基于XML的编码就知道它有多臃肿! 说什么跨平台特性,其实各个语言需要自己实现一整 ...

  9. iOS UILabel 使用姿势大全(标红关键字)

    一.初始化 ? 1 2 3 UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 44)];       ...

  10. ubuntu安装greenplum依赖包

    ubuntu安装greenplum的过程中有两个比较难找的包,特地写出来给大家分享一下: 错误提示1:configure: error: header file <ldap.h> is r ...