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

 更新时间:2017年05月14日 11:17:53   投稿:lqh  
这篇文章主要介绍了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); 
  } 

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

相关文章

  • Mac中Eclipse连不上Android手机的解决方法

    Mac中Eclipse连不上Android手机的解决方法

    这篇文章主要介绍了Mac中Eclipse连不上Android手机的解决方法,本文方法同样适用其它的移动设备,需要的朋友可以参考下
    2015-06-06
  • Android控件BottomSheet实现底边弹出选择列表

    Android控件BottomSheet实现底边弹出选择列表

    这篇文章主要介绍了Android控件BottomSheet实现底边弹出选择列表,比较常用的选择条件或跳转方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Android登录注册功能 数据库SQLite验证

    Android登录注册功能 数据库SQLite验证

    这篇文章主要为大家详细介绍了Android登录注册功能,数据库SQLite验证,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Android进程保活之提升进程优先级

    Android进程保活之提升进程优先级

    这篇文章主要介绍了Android进程保活之提升进程优先级,对提升优先级感兴趣的同学可以参考下
    2021-04-04
  • Android实现带磁性的悬浮窗体效果

    Android实现带磁性的悬浮窗体效果

    这篇文章主要介绍了Android实现带磁性的悬浮窗体效果,涉及Android针对窗体的动态操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 分析CmProcess跨进程通信的实现

    分析CmProcess跨进程通信的实现

    CmProcess是Android一个跨进程通信框架,无需进行bindService()操作,不用定义Service,也不需要定义aidl。 支持IPC级的 Callback,并且支持跨进程的事件总线,可同步获取服务,采用面向接口方式进行服务注册与调用,服务调用方和使用者完全解耦
    2021-06-06
  • Android基于OpenCV实现霍夫直线检测

    Android基于OpenCV实现霍夫直线检测

    霍夫变换利用点与线之间的对偶性,将图像空间中直线上离散的像素点通过参数方程映射为霍夫空间中的曲线,并将霍夫空间中多条曲线的交点作为直线方程的参数映射为图像空间中的直线。给定直线的参数方程,可以利用霍夫变换来检测图像中的直线。本文简单讲解Android的实现
    2021-06-06
  • Android 如何实现动态申请权限

    Android 如何实现动态申请权限

    这篇文章主要介绍了Android 如何实现动态申请权限。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android Metro菜单实现思路及代码

    Android Metro菜单实现思路及代码

    在安卓平台上实现一下Metro菜单效果,之前有介绍过了,相信大家对此不会陌生了吧,感兴趣的朋友可以了解下哈
    2013-06-06
  • Android基于OkHttp实现下载和上传图片

    Android基于OkHttp实现下载和上传图片

    这篇文章主要为大家详细介绍了Android基于OkHttp实现下载和上传图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11

最新评论