Activity recreate时导致Fragment被添加多次,显示混乱问题_recreate()方法导致fragment重复新建_大漠-孤烟的博客-程序员秘密

在某些场景下,旋转屏幕、内存不足,或app内切换语言主动调用reCreate()方法,造成Activity被destroy ,系统会recreate 重新创建该Activity ,会重走onCreate()方法, 如果Activity的onCreate中存在add Fragment操作,则会再次add一次该Fragment,造成该Activity中FragmentManager添加了多个相同的Fragment,造成也面显示覆盖的问题。

解决方案:

private int currentIndex = 0;
private Fragment currentFragment = new Fragment();
private Fragment fagment1 = new MyFragment1();
private Fragment fagment2 = new MyFragment2();

在onCreate()方法中判断savedInstanceState状态,reCreate()后savedInstanceState不为空,
通过getSupportFragmentManager().findFragmentByTag(),获取之前add过的fragment,
避免造成重复add fragment,savedInstanceState == null时调用的是原来onCreate()中的方法。


if (savedInstanceState != null) {
    fagment1 = getSupportFragmentManager().findFragmentByTag("tag1");
    fagment2 = getSupportFragmentManager().findFragmentByTag("tag2");
    //记录当前显示的时哪个fragment
    int tabId = savedInstanceState.getInt("currentIndex");
    if (tabId == 0) {
        switchFragment(fagment1).commit();
    } else {
        switchFragment(fagment2).commit();
    }
} else {
    switchFragment(investmentFragment).commit();
}



private FragmentTransaction switchFragment(Fragment targetFragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    if (!targetFragment.isAdded()) {
        if (currentFragment != null) {
            transaction.hide(currentFragment);
        }
        String tag = targetFragment.getClass().getName();
        transaction.add(R.id.fragment, targetFragment, tag);
    } else {
        transaction.hide(currentFragment).show(targetFragment);
    }
    currentFragment = targetFragment;
    return transaction;
}


public void onTabClick(View view) {
     switch (view.getId()) {
          case R.id.tab1:
               currentIndex = 0;
               switchFragment(fagment1).commit();
               break;
          case R.id.tab2:
               currentIndex = 1;
               switchFragment(fagment2).commit();
               break;
          default:
               break;
            
     }

 }


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



 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ReturnNull0/article/details/91585067

智能推荐

EDA软件_Cadence_OrCAD Capture常用快捷键_黑崎江的博客-程序员秘密

本文简单介绍了Cadence Capture的常用快捷键。

hdu 1075(字典树)_weixin_30535565的博客-程序员秘密

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1075wa了好多次啊。。。心都碎了。。。然后不知道怎么一改就对了。。。orz...建树的的时候每个单词的的最后一个结点应该加入译文的信息。。。islower()用于判断小写字母很好用。。。View Code 1 #include<iostream> 2 #inc...

(六)算法 -- 4. 级数展开_Fiona-Dong的博客-程序员秘密

4. 级数展开级数展开(series expansion)函数的值通过对级数项的求和来估计。如果每加入一个新的项都会使总和更接近于一个所期望的值,则级数是收敛的,可以用此级数估计结果。4.1 Zeno悖论Zeno悖论(Zeno’s paradox)横穿房间这个过程中的每一步都是走到剩余距离的一半。已经走过的每段距离的总和,可以表示为下式:12+14+18+116+132+164+1128+...\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\frac{1}{1

Django视图层_weixin_30443895的博客-程序员秘密

目录 Django视图层 概述 简单的视图实例 返回错误页面 HTTP 404异常 Djangoy请求和响应对象 HttpRequest对象 HttpResponse 对象 get_object_or...

算法和数据结构笔记(四) 字符串_dianliaocha5758的博客-程序员秘密

1 单词查找树:Trie树如果一个关键字可以成字符串的形式,那么可以用键树(Keyword tree),又称数字搜索树(Digital Search Tree)。键树的存储通常有两种方式:树的左孩子-右兄弟链表表示,每个Node有三个域(当前字符,左孩子的根,右兄弟的链表),称为双链树如图所示:用多重链表表示,每个Node应包含R个指针域(R为字符集的个数),称为T...

SQL 多字段模糊匹配关键字查询_短字段匹配长字段_aosica的博客-程序员秘密

http://www.west.cn/info/html/wangluobiancheng/Mssql/20080505/72303.html我们开发数据库应用时,常常需要用到模糊查询。如果同一个条件需要匹配很多字段怎么办呢?通常,程序员会每个字段都在SQL中“field like'%cond%'”一次。这样,SQL语句会长得惊人,碰上复杂一点的,甚至SQL语句会因为超长而被数

随便推点

unity reflect_使用Unity Reflect的不同方法_culiao6493的博客-程序员秘密

unity reflectAs we get closer to bringing Unity Reflect to the masses this fall, here’s an overview of how you’ll be able to use the product out of the box as well as make it your own. 随着我们将在今年秋天将Uni...

DDL、DML、DCL、TCL四种SQL语言对比_dcl和其他四种哪种最难_wangshuang1631的博客-程序员秘密

1、DDL—Data Definition Language数据定义语言被用于定义数据库接口及模式,包括外模式、概念模式、内模式及其相互之间的映像,定义数据的完整性、安全控制等约束。DDL不需要commit。 DDL主要操作如下: CREATE ALTER DROP TRUNCATE COMMENT RENAME2、DML—Data Manipulation Language数据操纵语

Verilog同步复位和异步复位_同步复位和异步复位verilog_onesway2018的博客-程序员秘密

同步和异步是针对时钟信号而言的。以时钟上升沿触发的同步复位和异步复位为例。同步复位需要一个reset的输入,可以规定在reset为1时复位。但在同步复位的条件下,并不是reset变成1之后马上就能复位,而是要等到下一个时钟上升沿,此时才能复位。异步复位也需要一个reset的输入,我们也规定在reset为1时复位。在异步复位的条件下,reset变成1之后(即reset的上升沿)立刻就能复位,并不需要等到下一个时钟上升沿。module top_module ( input clk, inp

Python--Django:远程连接MySQL8.0版本及以上报错的解决方法(django.db.utils.OperationalError)_此时一位小白路过的博客-程序员秘密

1 . 没有权限本地主机不被允许访问远程主机上的mysql服务器解决方法:在远程主机上,登陆进mysql服务器,设置权限mysql> create user 用户名@'要连接的主机ip' identified by '登录密码';mysql> grant all privileges on 数据库名字.* to 用户名@'要连接的主机ip' with grant option;mysql> flush privileges;··查看服务器中用户和主机名称mysq

什么是面向对象?面向对象和面向过程的区别?_benxiaohai888的博客-程序员秘密

面向对象的概念:面向对象是一种思维方式面向对象是一种编程方式面向对象并不只针对某一种编程语言面向对象的基本思想是,从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式。面向对象和面向过程的区别:面向过程:面向过程过程侧重整个问题的解决步骤,着眼局部或者具体优缺点优点: 流程化使得编

echarts 自定义鼠标划过的显示 与 自定义legend_echarts鼠标经过_﹏゛Aeljinh陌琳的博客-程序员秘密

option.tooltip.formatter 修改了鼠标划过显示效果效果:var legendData = ['concentrationAct','concentrationMet']var series = [ { name: legendData[0], type: 'line', symbol:'image://data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WO

推荐文章

热门文章

相关标签