[关闭]
@946898963 2020-06-11T10:05:46.000000Z 字数 1717 阅读 1282

Fragment重叠问题

Android学习笔记


关注重叠问题,可以结合自己项目开发中遇到的那个go_detail埋点上报多次的问题。

前面我们介绍 Fragment 初始化时提到 Activity 销毁重建的问题,试想一下,当 Activity 重新执行 onCreate() 方法时,是不是会再次执行 Fragment 的创建和显示等操作呢?而之前已经存在的 Fragment 实例也会销毁再次创建,这不就与 Activity 中 onCreate() 方法里面第二次创建的 Fragment 同时显示从而发生 UI 重叠的问题了吗?

根据经验,通常我们会在 AndroidManifest 里将 Activity 设置为横屏模式,所以不会由于屏幕旋转导致这种问题的出现。一种比较多的出现方式是,应用长时间处于后台,但由于设备内存吃紧,导致 Activity 被销毁,而当用户再次打开应用时便会发生 Fragment 重叠的问题。但是这种问题在开发阶段由于应用的频繁使用导致我们很难遇见,但确确实实存在着。所以开发过程中,一定要注意这类问题。

知道问题的根源所在之后,对应的解决方案也就有啦。就是在 Activity 中创建 Fragment 实例时,添加一个判断即可,处理方式有三种:

第一种方式,在 Activity 提供的 onAttachFragment() 方法中处理:

  1. @Override
  2. public void onAttachFragment(Fragment fragment) {
  3. super.onAttachFragment(fragment);
  4. if (fragment instanceof OneFragment){
  5. oneFragment = (OneFragment) fragment;
  6. }
  7. }

【Android开发】之Fragment生命周期(有关于onAttachFragment的调用时机)

正确使用android fragment

第二种方式,在创建 Fragment 前添加判断,判断是否已经存在:

  1. Fragment tempFragment = getSupportFragmentManager().findFragmentByTag("OneFragment");
  2. if (tempFragment==null) {
  3. oneFragment = OneFragment.newInstance();
  4. ft.add(R.id.fl_content, oneFragment, "OneFragment");
  5. }else {
  6. oneFragment = (OneFragment) tempFragment;
  7. }

第三种方式,更为简单,直接利用 savedInstanceState 判断即可:

  1. if (savedInstanceState==null) {
  2. oneFragment = OneFragment.newInstance();
  3. ft.add(R.id.fl_content, oneFragment, "OneFragment");
  4. }else {
  5. oneFragment = (OneFragment) getSupportFragmentManager().findFragmentByTag("OneFragment");
  6. }

关于Fragment重叠问题分析和解决 (记得看评论)

Android fragment 重叠问题的解决方法

fragment重叠的完美解决方案(最终看这个结合自己的实验Demo看明白了)

关于Fragment重叠异常问题

Fragment 重叠(重影)问题

从源码角度分析,为什么发生页面重启后会导致重叠?(建议多看看,从源码角度讲的,比较不错)

Fragment全解析系列(一):那些年踩过的坑(和上一篇讲到了一样的观点)

解决fragment重叠的问题

Fragment 全解析系列(二):正确的使用姿势(有关于FragmentManager栈视图的讲解,以及getFragments()还是findFragmentByTag()的区别)

Android中Fragment管理及重叠问题的解决方法(提到了另外一种情况)

Android中的Fragment(介绍了手动保存hide的状态的方法)

Fragment扩展三(关注Fragment的重叠问题,建议也阅读下这篇文章)

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注