Android点击Home键后fragment重新加载问题、重叠问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/androidwubo/article/details/71191092

现象:

同事的手机是OPPO-R9S,这个手机的垃圾回收真是吊炸天,activity中四个fragment,点击home键后再进入,显示退出时候的fragment,在切换其他fragment的时候,像是放在了下面不显示了,其他的手机没有发现这个问题

原因

使用 Fragment 的状态保存,当系统内存不足,Fragment 的宿主 Activity 回收的时候,Fragment 的实例并没有随之被回收。Activity 被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层(View Hierarchy),所以当 Activity 通过导航再次被重建时,之前被实例化过的 Fragment 依然会出现在 Activity 中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了。综上这些因素导致了多个Fragment重叠在一起。

方案一:
1.在给每个 Fragment 加一个 Tag‘

这个tag随便设置,最好用fragment.getclass.getname

fragmentTransaction.add(R.id.ll_fragment, fragments.get(position),tag);

2.在 onCreate(Bundle savedInstanceState) 中判断 Bundle savedInstanceState 是否不为空
3.不为空则进行 find Tag,重新给几个 frament 赋值

NewTaskFragment fragmen
= (NewTaskFragment) fragmentManager.findFragmentByTag(tag);

这样子仍是对之前保存的 fragment 操作,成功解决了重叠的问题。

注意:

这个只是对fragment状态保存,比如说toolbar,底部导航栏,都没有保存状态,所以还需要自行调整

方案二:
Activity 中的 onSaveInstanceState() 里面有一句super.onSaveInstanceState(outState);,Google 对于这句话的解释是 “Always call the superclass so it can save the view hierarchy state”,大概意思是“总是执行这句代码来调用父类去保存视图层的状态”。通过注释掉这句话,这样主 Activity 因为种种原因被回收的时候就不会保存之前的 fragment state,也可以成功解决重叠的问题。

注意:

这个不推荐设置,这样用户的体验不好,比如说,你推出的状态为一个fragment跳转的activity,当内存回收后,你再次进入的时候会进入到跳转的activity,但是,当你返回的时候就会默认跳转到你默认的fragment,不会停留在你所需要的fragment,所以,建议使用方案一,当然也看项目的实际需求



借鉴博客:

http://blog.csdn.net/fan7983377/article/details/51889269

http://blog.csdn.net/u014316462/article/details/50190137

http://blog.csdn.net/wangyetongsss/article/details/51790279



展开阅读全文

没有更多推荐了,返回首页