使用fragment导致页面错乱重叠

  • 记使用碎片fragment时,造成页面错乱,重叠显示

原因

  • 使用fragment时,为了防止重复replace,导致fragment每次都重新创建,重新获取数据,导致不必要的流量损失,所以一般使用hide和show来实现,但是这样会带来一个问题,就是当页面奔溃,然后自动打开当前主页面时,会发现几个不同的fragment页面错乱重叠了,或者在进行分屏时,也会出现这种情况。

解决办法

  • 之前看见别人的一篇博客,我忘记了是谁的博客,这里在记录一下,完全没有侵权的意思,如有冒犯,请正主留言我加上博客地址。
  • 解决方案:
    • 1.在存放fragment的Activity中的onSaveInstance方法中进行保存当前选中的fragment信息
@Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt("nowSelectedPage",index);
        super.onSaveInstanceState(outState);
    }
-  注解:在outState这个bundle中保存当前选中的页面信息,存放key——value值
  • 2.在存放fragment的Activity中的onCreate方法中判断savedInstanceState是否为空,如果不为空,说明上次是错误关闭页面,保存了选中的页面信息
@Override
    protected void onCreate(Bundle savedInstanceState) {
        pages = new HashMap<>();
        super.onCreate(savedInstanceState);
        fragmentManager = getSupportFragmentManager();
        if (savedInstanceState != null) {
             //读取上一次界面Save的时候tab选中的状态,默认是选中第一个
            lastIndex=savedInstanceState.getInt("nowSelectedPage",0);
            pages.put(PageEnum.HOME_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[0]));
            pages.put(PageEnum.BOARD_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[1]));
            pages.put(PageEnum.FOLLOW_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[2]));
            pages.put(PageEnum.MINE_PAGE,fragmentManager.findFragmentByTag(FRAGMENT_TAG[3]));
        }
         // 选中index
         setTabSelection(lastIndex);
    
    }
  • 3.在每个fragment初始化后添加进入事务,并且加入tag,保证后面通过tag取出fragment。
transaction.add(R.id.fl_main,homeFragment,FRAGMENT_TAG[0]);
transaction.add(R.id.fl_main,boardFragment,FRAGMENT_TAG[1]);
transaction.add(R.id.fl_main,followFragment,FRAGMENT_TAG[2]);
transaction.add(R.id.fl_main,mineFragment,FRAGMENT_TAG[3]);

这样操作后,fragment就不会再出现错乱重叠的情况。

!!!这是之前看见别人的一篇博客,我忘记了是谁的博客,这里在记录一下,完全没有侵权的意思,如有冒犯,请正主留言我加上博客地址。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容