Android中Fragment 重叠遮盖问题解决办法

Android中Fragment 重叠遮盖问题解决办法,第1张

概述1.导致Fragment重叠遮盖的原因主要还是因为Fragment的状态保存机制,当系统内存不足时,Fragment的主Activity被回收,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 重叠遮盖问题解决办法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存