Android学习笔记-recreate()方法导致fragment重复新建的问题,解决方法

今天修改一个比较奇怪的bug:
在操作一个事件的时候,使用eventbus来监听事件,断点发现有时候是会执行两次,起初以为是没有unregister。后来发现无论有没有unregister,都没用。
后面通过不断测试,发现只有在设置系统字体后,调用activity的recreate()方法会发生重复调用。
由于是在activity里面使用了4个fragment切换,我想到会不会是,recreate方法导致的fragement出现了两次,从而eventbus执行了两次。
先看一段代码:

 private void addOrShowFragment(FragmentTransaction transaction, Fragment fragment, int currentIndex) {if (currentFragment == fragment)return;if (currentFragment == null) {transaction.add(R.id.shopmallhomecontainer, fragment, tags[currentIndex]).commitAllowingStateLoss();} else if (!fragment.isAdded()) { // 如果当前fragment未被添加,则添加到Fragment管理器中transaction.hide(currentFragment).add(R.id.shopmallhomecontainer, fragment, tags[currentIndex]).commitAllowingStateLoss();} else {transaction.hide(currentFragment).show(fragment).commitAllowingStateLoss();}currentFragment = fragment;}

这是activity中切换fragment的代码。
调用方法如下:

 if (mainFragment == null) {mainFragment = new NewsMainFragment();}addOrShowFragment(getSupportFragmentManager().beginTransaction(), mainFragment, currentIndex);

调试发现每次recreate后mainFragment 和currentFragment都会会变成空。从而导致每次recreate后会重新new一个fragment再加到fragment管理其中。
所以需要在actvivity的onSaveInstanceState中保存下当前状态,同时在oncreate中通过savedInstanceState来去除状态:
我这里采用的是保存当前的index方式,代码如下:

 @Overridepublic void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putInt("currentIndex", currentIndex);}

只需要保存一个当前的fragment是第几个。

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_news_main);bottombar = (TabBar) findViewById(R.id.shopping_mall_tabbar);if (savedInstanceState != null) {currentIndex = savedInstanceState.getInt("currentIndex");String curTag = tags[currentIndex];currentFragment = getSupportFragmentManager().findFragmentByTag(curTag);mainFragment = (NewsMainFragment) getSupportFragmentManager().findFragmentByTag(tags[0]);videoFragment = (NewsVideoFragment) getSupportFragmentManager().findFragmentByTag(tags[1]);miniFragment = (NewsMiniFragment) getSupportFragmentManager().findFragmentByTag(tags[2]);meFragment = (NewsMeFragment) getSupportFragmentManager().findFragmentByTag(tags[3]);}bottombar.setOnTabBarSelectedListener(bottombarOnItemClick);bottombar.selectTab(currentIndex);}

通过index获取当前tag,同时找到当前fragment,其他4个frament可以通过各自的tag找到。
这时候再次执行

 if (mainFragment == null) {mainFragment = new NewsMainFragment();}addOrShowFragment(getSupportFragmentManager().beginTransaction(), mainFragment, currentIndex);private void addOrShowFragment(FragmentTransaction transaction, Fragment fragment, int currentIndex) {if (currentFragment == fragment)return;if (currentFragment == null) {transaction.add(R.id.shopmallhomecontainer, fragment, tags[currentIndex]).commitAllowingStateLoss();} else if (!fragment.isAdded()) { // 如果当前fragment未被添加,则添加到Fragment管理器中transaction.hide(currentFragment).add(R.id.shopmallhomecontainer, fragment, tags[currentIndex]).commitAllowingStateLoss();} else {transaction.hide(currentFragment).show(fragment).commitAllowingStateLoss();}currentFragment = fragment;}

这段代码的时候mainFragment 不会为空,同时currentFragment也不会为空,而且currentFragment取得的对象和之前的对象是同一个,这样一来,eventbus就不会重复执行了~

总结:事实上很多时候我们会忽略activity的onSaveInstanceState方法,其实onSaveInstanceState还是很有用的,用以上方式不知可以解决recreate时候导致的fragment重复新建的问题,其他场景也会用到哦,比如:屏幕旋转,进入后台之后再次启动(内存不够)等等。。用好onSaveInstanceState可以是我们的程序更加健壮。

Android学习笔记-recreate()方法导致fragment重复新建的问题,解决方法相关推荐

  1. Android学习笔记--GMS认证中常见的fail项及解决方法

    ############################################################# cts测试的一些命令:     sudo chmod a+x copy_me ...

  2. vue学习笔记(四)- cmd无法识别vue命令解决方法

    vue学习笔记(四)- cmd无法识别vue命令解决方法 参考文章: (1)vue学习笔记(四)- cmd无法识别vue命令解决方法 (2)https://www.cnblogs.com/suRimn ...

  3. nodejs学习笔记--Unexpected end of JSON input while parsing near ‘...“解决方法

    Unexpected end of JSON input while parsing near '-"解决方法 在学习nodejs时,用命令行工具执行npm install xxx,经常卡住 ...

  4. Android学习笔记:Android基础知识点(不断更新中)

    1.Android学习笔记:OkHttp 2.Android学习笔记:更新UI的方法(UI线程和非UI线程) 3.Android学习笔记:Volley 4.Android学习笔记:Handler 5. ...

  5. Android学习笔记第五篇--网络连接与云服务(一)

    Android学习笔记第五篇–网络连接与云服务 第一章.无线连接设备 ​ 除了能够在云端通讯,Android的无线API也允许在同一局域网内的设备通讯,**甚至没有连接网络,而是物理具体相近,也可以相 ...

  6. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)

    Android学习笔记之AndroidManifest.xml文件解析 一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它 ...

  7. Android学习笔记 75. 单元测试

    Android学习笔记 Android 开发者基础知识 (Java) -- Google Developers 培训团队 文章目录 Android学习笔记 Android 开发者基础知识 (Java) ...

  8. android jackson xml,[Android学习笔记]jackson库的使用

    Jackson库一般用于序列化和反序列化操作,通常会涉及到的操作是: 1. Java Object -> Json String 2. Java Object -> Xml String ...

  9. Android学习笔记21:ImageView获取网络图片

    Android平台有3种网络接口可以使用,它们分别是:java.net.*(标准java接口).org.apache(Apache接口)和android.net.*(Android网络接口).本文将使 ...

最新文章

  1. 状态估计问题学习记录(1)
  2. phalcon: 解决php7/phalcon3.2以上版本,不支持oracle数据库的方法
  3. 高等数学:第二章 导数与微分(3)函数微分 近似计算
  4. Kubernetes 弹性伸缩全场景解读(五) - 定时伸缩组件发布与开源
  5. 开始一瓢凉水浇顶,然后慢慢的感觉良好。
  6. ITK:切割网格CutMesh
  7. vb 6.0 获取重定向的url_接口测试:A07_HttpRunner重定向_04_解决方案
  8. php7扩展sphinx,php7进行安装sphinx简单记录
  9. Bootstrap HTML编码语法规范
  10. 编写MR代码中,JAVA注意事项
  11. LGOJP2831 愤怒的小鸟
  12. [20170203]克隆schema.txt
  13. 于歆杰pdf 电路原理_电路原理于歆杰答案pdf
  14. Apache Ranger:统一授权管理框架
  15. Android 手机实现网络嗅探发现周围设备(类似悟空遥控器)
  16. linux 加速度传感器数据获取,对加速度传感器的数据进行方向和坐标的转换
  17. 测试属性4 –准确性
  18. WireGuard组建大内网
  19. bellman operator 和bellman equation概念区分
  20. 如何安装最新版本的office(preview预览版)、更新

热门文章

  1. BMP文件二进制格式详解
  2. 知识点复习23 Mysql04
  3. 玉米社:抖音账号被限流了怎么办?一步步教你解除限制
  4. 抖音视频突然播放量少了很多,抖音限流怎么查看?
  5. 孙陶然:有能力的第二个标准是业绩好
  6. 东方证券首席架构师樊建:企业微服务架构转型实践
  7. DSP 中的基础算法和模型的详细解析
  8. 成功解决:Updates were rejected because the tip of your current branch is behind its remote...【解决方法】
  9. 试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次? 在1到11 中,即在1、2、3、4、5、6、7、8、9、10、11 中,数字1 出现了4 次。
  10. 网页无法显示PNG图片的解决方法