Fragment 重叠 遮盖问题 完美解决

举报
再见孙悟空_ 发表于 2022/01/14 00:24:26 2022/01/14
【摘要】 1.导致Fragment 重叠 和遮盖的原因  主要还是因为Fragment的状态保存机制,当系统内存不足时,Fragment的主Activity被回收,Fragment的实例并没有随之被回收。 Activity被系统回收时,会主动调用onSaveInstance()方法来保存视图层(View Hierarchy),所以当...

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方法,然后再通过保存切换的状态,发现结果非常完美。


  
  1. //记录Fragment的位置
  2. private int position = 0;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_index);
  7. setTabSelection(position);
  8. }
  9. @Override
  10. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  11. position = savedInstanceState.getInt("position");
  12. setTabSelection(position);
  13. super.onRestoreInstanceState(savedInstanceState);
  14. }
  15. @Override
  16. protected void onSaveInstanceState(Bundle outState) {
  17. //记录当前的position
  18. outState.putInt("position", position);
  19. }

文章来源: wukong.blog.csdn.net,作者:再见孙悟空_,版权归原作者所有,如需转载,请联系作者。

原文链接:wukong.blog.csdn.net/article/details/50381603

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。