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);  
    }  

  

最新文章

  1. Python为什么要self
  2. mysql 根据某些字段之和排序
  3. Java设计模式-外观模式(Facade)
  4. ./fedora_install_oracle.sh bad interpreter
  5. LoadRunner11下载以及详细破解说明【最新】
  6. URAL 1085 Meeting(最短路)
  7. PHP批量替换MySql数据库中的数据内容(替换MySql数据库内容源码)
  8. Android笔记——Handler更新UI示例
  9. cocos2dx libiconv 转码
  10. c#调用带有安全认证的java webservice
  11. 论js闭包的重要性
  12. Ribbon1: 在Office菜单中添加项目
  13. 创建成功的Python项目
  14. 设置Image渲染模式使用TintColor
  15. 201521123060 《Java程序设计》第6周学习总结
  16. PHPCMS模板里面使用自定义函数
  17. js 对象,数组,字符串,相互转换
  18. FIFO使用技巧
  19. mssql sqlserver 规范使用方法分享
  20. hdu 1237 简单计算器 (表达式求值)【stack】

热门文章

  1. poj3207 Ikki's Story IV - Panda's Trick 2-SAT
  2. SqlServer子查询、高级
  3. C语言warning的收集和总结
  4. 角色用户权限RBAC
  5. 在idea中使用@Test注解报错的解决方案
  6. JavaScript数据结构-8.双向链表
  7. Prinzipien der Computer Zusammensetzung
  8. Java Stream File & IO
  9. 样式styles和主题theme
  10. Android运行时权限开启问题