在使用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. 通过原生js的ajax或jquery的ajax获取服务器的时间

    在实际的业务逻辑中,经常是与时间相关的,而前端能获得的时间有两个:客户端的时间,服务器的时间. 客户端时间通过 javascript中的Date对象可以获取,如 var dt = new Date() ...

  2. C++动态数组的实现

    #include <iostream> using namespace std; int main() { int n; while(cin>>n) { ]; p[]=; p[ ...

  3. STL vector使用方法介绍

    介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  4. puppet安装和使用

    puppet是一种Linux.Unix.windows平台的集中配置管理系统,使用自有的puppet描写叙述语言,可管理配置 文件.用户.cron任务.软件包.系统服务等.puppet把这些系统实体称 ...

  5. NYoj-街区最短路径问题

    街区最短路径问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 一个街区有非常多住户,街区的街道仅仅能为东西.南北两种方向. 住户仅仅能够沿着街道行走. 各个街道之 ...

  6. iOS开发中NSDate时间戳的转换--

    NSTimeInterval time =(NSTimeInterval )[model.day floatValue]; NSDate *date = [NSDate dateWithTimeInt ...

  7. android:music

    package com.terry; import java.io.File; import java.io.FileFilter; import java.io.IOException; impor ...

  8. 为什么 Flask 有那么多的好评?

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:松鼠奥利奥链接:http://www.zhihu.com/question/28902969/answer/42530571来 ...

  9. GDG shanghai programming one hour by JavaScript

    刚在昨天参加了一场JS入门编程的活动,目的就是提升对JS的兴趣. 因为是针对零基础开发者的,一上来就是“Hello World!”了 当然,想用JS输出"Hello World!" ...

  10. 九度OnlineJudge之1023:EXCEL排序

    题目描述:     Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能.     对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始).随后在 N ...