Android中Fragment 重叠遮盖问题解决办法
1.导致fragment 重叠 和遮盖的原因
主要还是因为fragment的状态保存机制,当系统内存不足时,fragment的主activity被回收,fragment的实例并没有随之被回收。
activity被系统回收时,会主动调用onsaveinstance()方法来保存视图层(view hierarchy),所以当activity通过导航再次被重建时,之前被实例化过的fragment依然会出现在activity中,然而从上述代码中可以明显看出,再次重建了新的fragment,综上这些因素导致了多个fragment重叠在一起。
2.如果这个问题不是必现问题 ,调试的时候 可以将 开发者选项中的 “不保留活动” 打开 ,为了 模拟 activity 被及时回收。
3.onsaveinstancestate()与onrestoreinstancestate()这两个方法。
原本以为只有在系统因为内存回收activity时才会调用的onsaveinstancestate(),居然在转跳到其他activity、打开多任务窗口、使用home回到主屏幕这些操作中也被调用,然而onrestoreinstancestate()并没有在再次回到activity时被调用。而且我在onresume()发现之前的fragment只是被移除,并不是空,所以就算你在onresume()中执行问题一中创建的fragment的方法,同样无济于事。所以通过remove()宣告失败。
接着通过调查资料发现activity中的onsaveinstancestate()里面有一句super.onrestoreinstancestate(savedinstancestate),google对于这句话的解释是“always call the superclass so it can save the view hierarchy state”,大概意思是“总是执行这句代码来调用父类去保存视图层的状态”。其实到这里大家也就明白了,就是因为这句话导致了重影的出现,于是我删除了这句话,然后oncreate()与onrestoreinstancestate()中同时使用问题一中的创建fragment方法,然后再通过保存切换的状态,发现结果非常完美。
//记录fragment的位置 private int position = 0; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_index); settabselection(position); } @override protected void onrestoreinstancestate(bundle savedinstancestate) { position = savedinstancestate.getint("position"); settabselection(position); super.onrestoreinstancestate(savedinstancestate); } @override protected void onsaveinstancestate(bundle outstate) { //记录当前的position outstate.putint("position", position); }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读
-
Android中Fragment 重叠遮盖问题解决办法
-
Android中Fragment嵌套生命周期响应问题
-
Android中Fragment 重叠遮盖问题解决办法
-
Android 使用volley过程中遇到的问题解决办法
-
Android中fragment嵌套fragment问题解决方法
-
adb不是内部或外部命令,关于Android Studio中ADB命令不能用问题的解决办法
-
Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)
-
Android中Fragment嵌套生命周期响应问题
-
Android开发中如何解决Fragment +Viewpager滑动页面重复加载的问题
-
Android中fragment嵌套fragment问题解决方法