美文网首页小技巧android学习之路android知识点
9行代码让你App内的Fragment对重叠说再见

9行代码让你App内的Fragment对重叠说再见

作者: YoKey | 来源:发表于2016-06-12 21:40 被阅读31364次

在上一篇从源码角度分析,为什么会发生Fragment重叠?里,我们分析了造成Fragment重叠的原因,这一篇我会介绍几个解决方案,同时给出一个我的方案:9行代码让你app内的Fragment对重叠说再见!

更新:
官方在Support 24.0.0及以上版本已经修复了上篇源码分析的引起重叠的BUG; 所以如果你使用了24.0.0以上的版本,在正常情况下,就不用再考虑重叠的问题了!
(PS: 依然推荐阅读文末的 “补充” 部分)

通过findFragmentByTag() & getFragments()的解决方案

这两种方案在我这篇简书Fragment全解析系列(一):那些年踩过的坑里有比较详细的介绍,可以自行查看,这里不多做介绍,这两种方案也是最常见的解决方案。

缺点:

  • 使用比较麻烦,代码量较多;
  • 在Fragment嵌套的场景下,恢复会有问题,原因在于:页面重启后,在父Fragment没有初始化完成前,getChildFragmentManager()子栈内的子Fragment是空,只有父Fragment初始化完成后,子栈内的子Fragment才能正确获取到。

从源码角度想到的解决方案:自己保存Fragment的Hidden状态

下面这个方案,是我在完善Fragmentation库时想到的方案。

Fragmentation库前几天push了改变重大的0.7版本,应该算是比较成熟了,如果你重度使用Fragment或者想使用单Activity+多Fragment的组件架构的话,强烈推荐看看;对于各种复杂嵌套、同级Fragment的使用场景,你不必担心Fragment的重叠,同时大大简化Fragment的嵌套逻辑。

上一篇简书分析中,我们知道了发生Fragment重叠的根本原因在于FragmentState没有保存Fragment的显示状态,即mHidden,导致页面重启后,该值为默认的false,即show状态,所以导致了Fragment的重叠。

根据这个原因,我想到我们手动维护一个mSupportHidden不就行了吗?
看下面的基类Fragment代码:

public class BaseFragment extends Fragment {
    private static final String STATE_SAVE_IS_HIDDEN = "STATE_SAVE_IS_HIDDEN";

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
    ...
    if (savedInstanceState != null) {
        boolean isSupportHidden = savedInstanceState.getBoolean(STATE_SAVE_IS_HIDDEN);

        FragmentTransaction ft = getFragmentManager().beginTransaction();
        if (isSupportHidden) {
            ft.hide(this);
        } else {
            ft.show(this);
        }
        ft.commit();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        ...
        outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden());
    }
}

是的你没看错,只要上面的9行代码! FragmentState没帮我们保存Hidden状态,那就我们自己来保存,在页面重启后,我们自己来决定Fragment是否显示!
解决思路转变了,由Activity/父Fragment来管理子Fragment的Hidden状态转变为 由Fragment自己来管理自己的Hidden状态

优点:不管多深的嵌套Fragment、同级Fragment等场景,全都可以正常工作,不会发生重叠!
缺点:无。

补充

有些小伙伴反应还是会重叠,其实是因为加载根Fragment时没有经过判断的原因,当在类似onCreate等里加载根Fragment时,需要下面的判断,避免重复加载相同的Fragment:
(PS:addreplace情况下,如果没有加入回退栈,则不判断也不会造成重叠;若加入回退栈,则也会造成重叠现象,建议统一判断下)

public class MainActivity ... {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        ...
        // 这里一定要在save为null时才加载Fragment,Fragment中onCreateView等生命周里加载根子Fragment同理
        // 因为在页面重启时,Fragment会被保存恢复,而此时再加载Fragment会重复加载,导致重叠
        if(findFragmentByTag(rootFragmentTag) == null){
              // 正常情况下去 加载根Fragment 
        }
    }
}

最后

最后的方案用在了我的Fragmentation库中,在新的仿知乎的Demo里,各种复杂场景表现完美。

但是这个方案真的神奇的不可思议,在我的测试下,各种情况都正常适用,但是之前从没看到有人提到过该方案,所以如果你发现该方案有我没有考虑到的BUG,请第一时间告诉我!

官方在Support 24.0.0及以上版本已经从底层使用该方式修复该BUG;如果你还在使用 < 24.0.0 的版本,还是需要这 ”9行代码“的~

最后是一点心得体会:
当遇到问题时,我们如果从源头思考:为什么会发生这个问题? 从源码角度分析问题,可能就会得到一个更好的解决问题的思路!

相关文章

  • 9行代码让你App内的Fragment对重叠说再见

    在上一篇从源码角度分析,为什么会发生Fragment重叠?里,我们分析了造成Fragment重叠的原因,这一篇我会...

  • 防止Fragment重叠的封装

    注意:下面的内容已经过时,只留作备份。已经有更好的办法了,请看这里: 9行代码让你App内的Fragment对重叠...

  • Fragment重叠异常

    一、什么是Fragment重叠?二、什么情况下会发生Fragment重叠?三、为什么会发生Fragment重叠?1...

  • Fragment重叠

    主界面Activity中多个Fragment使用show hide的方式切换。、当手机内存不足、屏幕旋时Activ...

  • RadioButton+Fragment 实现导航栏碰到的一些常

    解决一个activity中,多个已被初始化的fragment UI 重叠问题 两个fragment重叠的效果: 解...

  • DataBinding

    Data Binding 优势 MVVM 去掉Activity&Fragment内的UI代码 减少FindView...

  • Fragment重叠问题

    Android横屏下Fragment界面重叠问题 - 阿里云 主要是因为生命周期的问题,当横屏显示fragment...

  • fragment重叠问题

    应用按home键回到桌面的时候会调用 onsaveinstancestate的时候 fragment被保存了但是重...

  • Fragment重叠问题的原因与解决方案

    前言 前段时间在工作中遇到了fragment的重叠问题,耽误了挺久的,主要原因还是在于自己对fragment的研究...

  • Android Fragment重叠,UI重叠问题

    问题现象: 一般出现在单activity+多fragment结构,当应用异常后,会可能出现这种现象 问题出现本质:...

网友评论

  • hymKing:您好,我想知道,你是怎么知道24.0.0版本,关于fragment重叠的问题已经修复了
  • 我的橘子分你一瓣:我去官方文档https://developer.android.com/topic/libraries/support-library/rev-archive?hl=zh-cn#rev24-1-0 看了下 似乎并没有直接说明fix 了此bug ;此外看Fragment源码也没有看到 outState.putBoolean(STATE_SAVE_IS_HIDDEN, isHidden()); 类似代码
  • 碧海鱼龙:讲解的很到位!学习了!
  • 81fe47063f6e:楼主 库支持 多个Activity 多个Fragment吗
  • ZkJanus:楼主,我现在碰到个问题。MainActivity中通过Add的方式,把FragmentA、FragmentB、FragmentC.......添加到FragmentList中。其中FragmentA中ListView条目双击到FragmentB中,我是replace的方式。并在MainActivity中用回退栈。现在进应用,我先点击到FragmentC中,再到FragmentA中双击条目,再点击FragmentC,看不到视图内容。这个是重叠吗?
  • 未来_7ca7:点击运行app在后台时,再次点击桌面app图标,这时候出现内存重建,重叠了,这怎么办,上面的方法都式了
  • 谁的春春不迷茫:作者,通过isHiden()判断状态,如果第一次显示的话并不会回调onhiddenChanged()方法,这时候我就获取不到他的状态,那么重启后的设置,会不正确吧

    YoKey:@青春不迷茫_Lee 不会的,把层级情况考虑,比如父FG是hide 状态,子FG的状态就不用考虑了,肯定都会隐藏
    谁的春春不迷茫:就是如果他第一次显示,那么他的ishiden()返回值是false,但是其实他是显示的,这会导致之后以ishiden()作为返回值判断是否显示,出问题,导致会重叠
  • Simple宁:博主你好,我按照您的文章,加了9行代码,现在还是重叠,有个疑问请教您一下。
    比如我Activity上是3个按钮分别对应FragmentA B C,onCreate里面默认显示FragmentA,点击按钮切换了几次FragmentA B C,界面显示在FragmentC,此时我屏幕切换方向,我的配置文件里面没有设置切换屏幕方向不走生命周期,所以切换方向的时候,Activity经历了生命周期。
    同时,BaseFragment里面,正确存储了我的isHidden()。
    屏幕翻转完成之后,执行Activity的onCreate,首先恢复我的FragmentA B C,此时BaseFragment的onCreate里面,也正确隐藏了A B,显示了C,
    恢复Activity里面加了判断:
    if (savedInstanceState == null){
    switchFragment(0);
    }
    所以这个时候,不会再去显示FragmentA,此时一切都是对的,没有重叠:显示C
    可是,当我点击按钮,从C切换到A的时候,由于在Activity的onCreate里面,重新new了一遍Fragment,因此我的这个判断里面,本来应该隐藏C显示A,这个时候C不是同一个,所以C隐藏不了,显示出来了A,A和C重叠在了一起。
    YoKey:@Simple宁
    fragments.add(new FragmentA());
    fragments.add(new FragmentB());
    fragments.add(new FragmentC());

    替换为:
    if(findFragment(A'sTag) == null){
    // new
    }else{
    fragments.add(findFragment(A'sTag));
    }
    Simple宁:麻烦博主百忙之中抽空帮我看一下我这个重叠应该如何解决?已经困扰我很久了,谢谢
    Simple宁:Activity里面:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d("MainActivity", "onCreate");
    setContentView(R.layout.activity_main);

    fragmentManager = getSupportFragmentManager();
    fragments = new ArrayList<>();
    fragments.add(new FragmentA());
    fragments.add(new FragmentB());
    fragments.add(new FragmentC());
    initView();

    if (savedInstanceState == null){
    switchFragment(0);
    }
    }


    public void switchFragment(int position) {
    transaction = fragmentManager.beginTransaction();
    for (int i = 0; i <fragments.size() ; i++) {
    Fragment fragment = fragments.get(i);
    if (fragment != null){//加判断
    if (i == position){//显示fragment
    if (fragment.isAdded()){ //如果这个fragment已经被事务添加,显示
    transaction.show(fragment);
    }else{
    transaction.add(R.id.fl_main,fragment); //如果这个fragment没有被事务添加过,添加
    transaction.addToBackStack(null);//去掉不去掉 都会导致重叠
    }
    }else{//隐藏fragment
    if (fragment.isAdded()){//隐藏fragment //如果这个fragment已经被事务添加,隐藏
    transaction.hide(fragment);
    }
    }
    }
    }
    transaction.commit(); //提交事务
    }
  • 恒等式古怪:支持支持🙏
  • 062d8c24ee5a:你好,你的文章写的很好,不过我试用了你的方法,在旋转屏幕的情况下,如果不添加tag做判断一样会重叠,同时,也不会保留fragment的显示状态(在使用v4包24以下);在使用v4包24以上,你的这种方法还会破坏google修改的bug,不知道是你弄错了,还是我哪里写错了,望你能测试,指点一二。
    062d8c24ee5a:在使用add(),show(),hide()的方式下,解决重叠的问题还是需要减少实例化对象;与他的显示状态无关。您的这种方式在v4 24以上,原本显示的是从FragmentA->FragmentB;选择屏幕,本身应该为FragmentB,但是显示的为添加的顺序了,FragmentA。Google v24修复的是旋转显示的问题,在onSaveInstanceState方法中会调用FragmentManger的onSaveInstanceState方法,在24包中对fragment的显示在onSaveInstanceState中添加了这个保存,才得以可以恢复。建议您测试试试。如果我有纰漏望能指正。
    062d8c24ee5a:你好,是根fragment,我再activity中的oncreate方法中判断了savedInstanceState,if(savedInstanceState != null){
    fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag("myFragment");
    }
    我说的情况确实存在,我反复测试了。
    YoKey:如果是加载的根Fragment,需要如下判断:
    if(findFragmentByTag(rootFragmetTag) ==null) {
    // 加载Fragment
    }

    v24以上,那9行代码重复调用不会有副作用的
  • MambasJi:博主你好酷!
    有一个问题就是我能不能直接在Activity的onCreate()中判断Bundle是否为空进而来判断是否重新加载Fragment 就行,而不需要使用BaseFragment
    YoKey:@Manbas_JI 这样也是可以的~
  • 事情往往烟消云散:我在使用这个解决方案的时候,只有第一个fragment中的控件的正常使用,其他界面的控件却不能正常使用,每次切换fragment的时候,那些控件才能获取到焦点
    YoKey:看起来是焦点问题,可以看下是否在theme里有 Hardware 硬件加速的属性
  • c72e13ece2da:在我自己的使用场景中,试用了该方法,还是会偶现重叠的问题。场景:一个activity中,几个Fragment来回切换,同时还横竖屏切换,几次横竖屏之后就会出现这样的情况。请楼主帮忙分析下。
    YoKey:重叠有2种原因: 1、重复加载了同一个Fragment,导致重叠
    2、在24.0以下版本,因为support包的BUG,没有记录hidden状态,导致旋转屏幕等情况时,所有Fragment都是show状态,从而导致重叠
  • 暮云清风:作者很用心,我问了几次都很认真回答,给了我不少启发。希望大神能笔耕不倦,为我等小白带去光明。:clap:
  • cc77cd26e73a:官方在Support 24.0.0及以上版本已经修复。
    楼主大神这个的意思是,我的AS里的Support如果是 25.0.0,而我编译后的APP在低于24的安卓手机上使用,是否还需要您的9行代码?
    YoKey:@独孤航海 不需要哒~ support v4包就意味着兼容到API 4版本的
  • mundane:我的v4包是24.2.1的版本为什么还是出现了fragment重叠的现象
    YoKey: @mundane 检查下页面重启后 是否重复加载了fragment
  • 62a89a5eab21:楼主,我照你的方法写了一遍,也打开了手机开发者模式->不保留最近活动,然后写了2个地步tab切换fragment,在saveinstance==null的时候添加了frgament,但是退出APP再进入的时候,点击切换不了fragment是什么原因呢,我打印发现恢复的fragments是空,除了这几行代码还要做什么操作吗
    YoKey:@斯蒂 需要通过FragmentManager找回, 参考这里:
    https://github.com/YoKeyword/Fragmentation/blob/master/demo/src/main/java/me/yokeyword/sample/demo_zhihu/MainActivity.java#L58
    62a89a5eab21:@YoKey 对的 就是点击home键 我进来的时候 点按钮切换fragment就没反应了。我是装在fragment数组里加载的,点了home进来数组里为空了,是需要自己写保存吗?
    YoKey:@斯蒂 不是退出 是点击home回到桌面再进来
    只要离开前fragment已经被加载 系统就会帮你保存 在下次进来时恢复
  • 相互交流:楼主怎么模拟内存回收,,看看Fragment 是否重叠...
    相互交流:@YoKey 对了楼主,,这样的话,,是activity 回收,,Fragment可不可能在内存不足被后台回收呢,,这样的话,,会有影响吗???
    相互交流:@YoKey 好的,,谢谢...
    YoKey:@相互交流 旋转屏幕或者 打开 开发者模式->不保留最近活动 即可 模拟~
  • 52599a6b3597:真想拜大神为师
  • SuperStarBoy:使用静态工程创建的Fragment就不会有问题了
  • ec2514fb1209:当退出最后一个Fragment后,界面会留白一段时间,然后恢复正常,这是为什么?
    YoKey: @Pennan 正常啊 上一个AC正在恢复中,所以会空白很一小段时间
    ec2514fb1209:@YoKey 就是当内存重启后,退出最后一个Fragment的同时,宿主Activity也退出,即退出到上一个Activity,界面都会留白一段时间。 :flushed:
    YoKey:@Pennan 没有遇到过这个奇怪的现象, 一般的需求是退出最后一个FG的同时,宿主Activity也跟随finish掉
  • d9b37f45f8e3:平板项目,类似于QQHD,正恼fragment多层嵌套和栈进出问题,就看到这篇了,救星啊!!!
  • Dracula716:厉害,一下豁然开朗了关于fragment的使用
  • 泽贰:感谢楼主这么给力谅解
  • 啸林:你说的重叠是指fragment1跳fragment2然后back键重叠吧
    YoKey: @Neexz 可以参照 另一篇分析的文章
    WYWT:@桃花林里练醉拳 请问这种重叠的原因是什么啊?
    YoKey: @桃花林里练醉拳 不是~ 文中指的是使用fragment时,屏幕旋转或者 在后台因内存不足app被杀死 再回到app时app重启导致的 fragment重叠
  • 297526f7370d:一行代码足矣
    297526f7370d:@YoKey 不是,我之前遇到这个问题,换一种提交方式就OK了
    YoKey:@297526f7370d :flushed: 诶?还有这么神奇的一行代码? 额,为啥不直接说代码~
    你指的是setRetainInstance()? ~ 这个适用性太低~
  • Fi7z:在ViewPager里面的Fragment没效果啊
    YoKey: @backkomyoung 是用的FragmentPagerAdapter或FragmentPagerStateAdapter? ViewPager内的Fragments的重叠? 这就需要你看你是否规范使用Adapter

    还是和ViewPager前面的Fragment导致的重叠? 这个代码实测在这种情况下不会重叠的,你检查下代码
    Fi7z: @YoKey 我在viewpager里还真遇到了fragment重叠
    YoKey:@backkomyoung ViewPager里的Fragment本来就不会重叠的,FragmentPagerAdapter内部已经帮我们处理了的,所以在这种情况下,那9行代码可有可无,不过有的话也不会产生任何影响。 :blush:
  • 无聊的ddd:有个问题问你一下 , 我在两个fragment中 用了 一个自定义控件 然后用 show hide 切换,但是 怎么切换都是只有 第一个界面有那个 控件 为什么?第二个界面那个控件就消失了 ,但是点击事件还是有的
    YoKey:@无聊的ddd Fragment的show,hide,本质是让Fragment的布局Visisbilty,GONE 你从这个角度看看 是否有关联
    无聊的ddd:@YoKey 我找到问题点了 但是不知道为什么 ,这个控件 在 绘制上用的 是onpredrawlistener 结果 切换fragment 后 不掉用 这个 导致 没有显示。。。。。。但是 为什么 fragment 不掉用呢?
    YoKey:@无聊的ddd ....这种神奇的问题没遇到过~ 只能检查下代码吧 :joy:
  • 娃娃要从孩子抓起:博主,我看了你的开源库Fragmentation,写的非常好,里面的例子也特别好,能不能写一些关于这个库使用的文章?
    YoKey:@娃娃要从孩子抓起 我也比较头疼,怎么描述比较好 :joy:
    那个库主要是loadX方法是加载孩子Fragment,startX,pop方法操作加载兄弟Fragment,startChild,popChild等方法是操作子Fragment; 感觉理清这3种方法的关系配合栈视图调试开发,就很简单
    娃娃要从孩子抓起:@YoKey 看过了,现在研究Demo,感觉博大精深啊,实际开发中遇到的很多问题都有解决,所以希望楼主能针对这个库和demo能出一些文章,这样读者可能会理解的更深刻:pray:
    YoKey:@娃娃要从孩子抓起 你可以看看项目里的wiki :
    https://github.com/YoKeyword/Fragmentation/wiki :blush:
  • yangyirunning:在代码片段中的isHidden()方法是什么?如何确定在onSaveInstance(异常终止)时此Fragment的显示隐藏状态?
    YoKey:@东仙轶Primo 不用的 全部通用 我的这个思路是Fragment自己管理自己的显示隐藏状态,不再是Activity或父Fragment管理了
    话说Activity也没有isHidden方法
    yangyirunning:@YoKey 博主,我看您的这种用一个boolean类型变量标记显示隐藏状态的方法是写在了Fragment的基类里面,而通常我们在写App时,首页的Activity经常会设计成一个同级式Fragment(下边有若干个tab页),而这种往往是继承自一个Activity基类的,是否可以得出结论,在基类Activity中,也得把上述的9行代码写一遍?
    YoKey:@东仙轶Primo :smile: isHidden()是Fragment自带的方法,返回Fragment的show/hide状态,也是通过该方法确定当前Fragment的显示隐藏状态的
  • fxzou:当Fragment创建时调用setRetainInstance(true),也可以
    fxzou: @YoKey 长知识了,谢谢解答😊
    YoKey:@Fxiang_ 嗯,不过有局限性;在屏幕旋转的情况下,setRetainInstance(true)会不销毁Fragment,从而不会重叠;
    而在因内存不足导致app在后台被强杀的情况下,这个就避免不了重叠了;
    另外setRetainInstance()在嵌套子Fragment下使用会导致崩溃 :dizzy_face:
  • Hidetag:mark
  • 2cffbcb5d8e1:给跪了
  • 6db2cd5e23ce:赞,这个思路之前怎么就没人想到呢???
    YoKey:@Hideeee 我是从源码上分析得到的思路,确实非常简单,但是在解决重叠方面以我的各种测试来看都表现很完美! :joy:
  • KunMinX:你们说的fragment重叠是什么个情况,是不是例如overflow的菜单重复了很多?
    YoKey:@简洁笔记 是在使用add加载Fragment,并且使用show,hide来控制Fragment,如果没有相关恢复处理,在页面被强杀重启后,就会导致这多个Fragment都是show的形态显示,即多个布局叠加在Activity上 :smile:
  • lee小杰: :joy: 再次膜拜大神
  • 36a453c057aa:我发现在横竖屏切换的时候会发生fragment的重叠的问题,按作者的写法没有解决问题,后来发现在配置文件中 activity中加上 android:configChanges="orientation|screenSize",可以避免横竖屏切换的时候activity重走生命周期方法,解决了问题。
    36a453c057aa:你好 我在mainactivity的oncreate中做了
    if (savedInstanceState == null){
    showFragment(1);
    }
    在basefragment中也加了隐藏状态的判断,但是横竖屏切换的时候还是会发生重叠的现象,我在切换fragment的时候做的操作是先隐藏所有的fragment,然后再显示某一个fragment。我不太清楚是不是我的写法有问题?
    36a453c057aa:@YoKey 哦哦 原来是这样 谢谢指点
    YoKey:@我是启昌 你是否在onCreate里没有判断saveInstance为空的情况下才加载Fragment:
    if(saveInstance ==null){
    // 加载Fragment
    }

    在onCreate等初始化生命周期内加载Fragment,为了防重复加载Fragment,在页面重启时就不要再去加载Fragment了, 用上面的写法就可以避免了 :smile:
  • fe2a5bcdf6ea:我进fragment 打开Activity 然后再打开Activity这个时候应用报错崩掉了 然后应用自动重启 进来 fragment还是有重叠啊 楼主 我就是复制你的basefragment 然后让我原来的fragment继承 貌似没有什么用啊
    fe2a5bcdf6ea:@YoKey 感谢耐心解答 我要学习的还有很多 :+1:
    YoKey:@蹦蹦跳跳真可爱 我想你需要先看下安卓的保存恢复机制,onSaveInstanceState()方面的东西,我上篇文章前部分有个简单的描述; 至于仍然重叠的问题,检查下你的使用场景和根Fragment,根Fragment是需要额外处理的,上面的回复提到了; 这部分内容比较重要,可以研究下 :blush:
  • fe2a5bcdf6ea:我应用出bug的话老是会如此 崩掉 然后就用问题了
    YoKey:@蹦蹦跳跳真可爱 重叠问题,还有一点是加载第一个Fragment,即根Fragment时,需要判断下:
    if(saveInstance == null){ //加载Fragment } 这个是常识,文章内没有提及

    崩溃问题,需要你自己找发生页面重启时哪里导致的,然后进行保存恢复
    fe2a5bcdf6ea:@蹦蹦跳跳真可爱 不过好像没什么用啊
    YoKey:@蹦蹦跳跳真可爱 app在后台时,如果内存不足,会导致app被强杀,切回来后重启,你的崩溃很可能时有些变量你没进行保存恢复,就产生了空指针导致崩溃;重叠的详细原因,可以看我的上一篇文章 :smile:
  • fe2a5bcdf6ea:STATE_SAVE_IS_HIDDEN 大神这个值是什么啊
    YoKey:@蹦蹦跳跳真可爱 Bundle的Key值,可以是任意String值~
  • 幸福的李雨龙:大神你做Android多久了
    YoKey:@幸福的李雨龙 快3年了 :joy:
  • 菲利柯斯:收藏了,我现在的应用切换到别的应用过一会再切换回来就会崩溃接着主页就会有重影,为什么呀,捕获不到这个异常
    YoKey:@_hxb 不会出现 恢复时重新创建Activity然后把保存的状态恢复给Activity 重新创建时 List会被重新new
    YoKey:@菲利柯斯 内存不足,导致app被强杀,切回来后重启,你的崩溃很可能时有些变量你没进行保存恢复,就产生了空指针导致崩溃;重影就是重叠,看我的上一篇文章,有详细解释原因 :smile:

本文标题:9行代码让你App内的Fragment对重叠说再见

本文链接:https://www.haomeiwen.com/subject/aszedttx.html