@946898963
2020-06-11T18:05:46.000000Z
字数 1717
阅读 1418
Android学习笔记
关注重叠问题,可以结合自己项目开发中遇到的那个go_detail埋点上报多次的问题。
前面我们介绍 Fragment 初始化时提到 Activity 销毁重建的问题,试想一下,当 Activity 重新执行 onCreate() 方法时,是不是会再次执行 Fragment 的创建和显示等操作呢?而之前已经存在的 Fragment 实例也会销毁再次创建,这不就与 Activity 中 onCreate() 方法里面第二次创建的 Fragment 同时显示从而发生 UI 重叠的问题了吗?
根据经验,通常我们会在 AndroidManifest 里将 Activity 设置为横屏模式,所以不会由于屏幕旋转导致这种问题的出现。一种比较多的出现方式是,应用长时间处于后台,但由于设备内存吃紧,导致 Activity 被销毁,而当用户再次打开应用时便会发生 Fragment 重叠的问题。但是这种问题在开发阶段由于应用的频繁使用导致我们很难遇见,但确确实实存在着。所以开发过程中,一定要注意这类问题。
知道问题的根源所在之后,对应的解决方案也就有啦。就是在 Activity 中创建 Fragment 实例时,添加一个判断即可,处理方式有三种:
第一种方式,在 Activity 提供的 onAttachFragment() 方法中处理:
@Override
public void onAttachFragment(Fragment fragment) {
super.onAttachFragment(fragment);
if (fragment instanceof OneFragment){
oneFragment = (OneFragment) fragment;
}
}
【Android开发】之Fragment生命周期(有关于onAttachFragment的调用时机)
第二种方式,在创建 Fragment 前添加判断,判断是否已经存在:
Fragment tempFragment = getSupportFragmentManager().findFragmentByTag("OneFragment");
if (tempFragment==null) {
oneFragment = OneFragment.newInstance();
ft.add(R.id.fl_content, oneFragment, "OneFragment");
}else {
oneFragment = (OneFragment) tempFragment;
}
第三种方式,更为简单,直接利用 savedInstanceState 判断即可:
if (savedInstanceState==null) {
oneFragment = OneFragment.newInstance();
ft.add(R.id.fl_content, oneFragment, "OneFragment");
}else {
oneFragment = (OneFragment) getSupportFragmentManager().findFragmentByTag("OneFragment");
}
关于Fragment重叠问题分析和解决 (记得看评论)
fragment重叠的完美解决方案(最终看这个结合自己的实验Demo看明白了)
从源码角度分析,为什么发生页面重启后会导致重叠?(建议多看看,从源码角度讲的,比较不错)
Fragment全解析系列(一):那些年踩过的坑(和上一篇讲到了一样的观点)
Fragment 全解析系列(二):正确的使用姿势(有关于FragmentManager栈视图的讲解,以及getFragments()还是findFragmentByTag()的区别)
Android中Fragment管理及重叠问题的解决方法(提到了另外一种情况)
Android中的Fragment(介绍了手动保存hide的状态的方法)
Fragment扩展三(关注Fragment的重叠问题,建议也阅读下这篇文章)