Fragment重叠
来源:互联网 发布:促销规则 数据库设计 编辑:程序博客网 时间:2024/06/05 08:26
一、问题描述
相信大家在使用Fragment的过程中,肯定碰到过Fragment重叠的问题,重启应用就好了。然而原因是什么呢?
首先,Android管理Fragment有两种方式,使用add、hide、show的方式和replace方式,两种方式各有优缺点。
1.replace方式
如果使用这种方式,是可以避免重叠的问题,但是每次replace会把生命周期全部执行一遍,如果在这些生命周期函数 里拉取数据的话,就会不断重复的加载刷新数据,所以我们并不推荐使用这种方式。
2.add、hide、show的方式
虽然这种方式避免了可能重复加载刷新数据的问题,但是会出现重叠的问题。
原因:
当系统内存不足,Fragment 的宿主 Activity 回收的时候,Fragment 的实例并没有随之被回收。Activity 被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层(View Hierarchy),所以当 Activity 通过导航再次被重建时,之前被实例化过的 Fragment 依然会出现在 Activity 中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了,所以就出现了重叠。
然而我们还是推荐使用这个,我们可以解决。
四、解决方法
方法一、简单暴力
通过注释掉这句话,这样主 Activity 因为种种原因被回收的时候就不会保存之前的 fragment state
@OverrideprotectedvoidonSaveInstanceState(Bundle outState) {//如果用以下这种做法则不保存状态,再次进来的话会显示默认tab//总是执行这句代码来调用父类去保存视图层的状态//super.onSaveInstanceState(outState);}
方法二、(推荐使用)
重写onAttachFragment,重新让新的Fragment指向了原本未被销毁的fragment,它就是onAttach方法对应的Fragment对象
@Override public void onAttachFragment(Fragment fragment) { if (tab1 == null && fragment instanceof Tab1Fragment) tab1 = fragment; if (tab2 == null && fragment instanceof Tab2Fragment) tab2 = fragment; if (tab3 == null && fragment instanceof Tab3Fragment) tab3 = fragment; if (tab4 == null && fragment instanceof Tab4Fragment) tab4 = fragment; }
方法三
思路同样是阻止系统恢复Fragment state,在FragmentActivity保存所有Fragment状态前把Fragment从FragmentManager中移除掉。
protected void onSaveInstanceState(Bundle outState) { FragmentTransaction transaction = fm.beginTransaction(); transaction.remove(tab1); transaction.remove(tab2); transaction.remove(tab3); transaction.remove(tab4); transaction.commitAllowingStateLoss(); super.onSaveInstanceState(outState); }
- Fragment重叠
- Fragment重叠
- fragment重叠
- android fragment重叠解决办法
- android-fragment重叠解决方法
- fragment重叠问题
- fragment布局重叠
- Fragment出现重叠现象
- Fragment重叠问题
- Android fragment 重叠问题
- 解决Fragment重叠问题
- fragment重叠问题
- Fragment 重叠(重影)问题
- Fragment重叠问题
- 解决 Fragment 重叠问题
- Fragment重叠的解决办法
- Fragment重叠的问题
- Fragment 重叠(重影)问题
- Redis设实
- centos防火墙iptables设置
- 线段树基础大入门
- 点击按钮弹出对话框 下载图片
- 表面着色器(Surface Shader)的写法(一)
- Fragment重叠
- PHP基础之字符串
- 在cocoapods更新出现提示 Unable to find a specification for `xxxxx` Pod的目录清理一下就行了
- 后台传输JSON或List<对象>,前台对应的解析方法
- GitLab之创建项目组及项目
- pagination分页插件1.2.7版本遇到的问题
- 最少拦截系统(hdu-1257)(最长上升子序列)
- HSV 物品检测(我检测是自己的眼药水)
- 瀑布流插件编写