欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-05 22:15:58
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); 
  } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!