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); }
相关文章
- ViewPager+RadioGroup实现标题栏切换,Fragment切换
- Android Activity与Fragment之间的传值概述
- Fragment基类中定义的对象如何让继承的子fragment直接可以使用?
- Fragment全解析系列(一):那些年踩过的坑
- 9行代码让你App内的Fragment对重叠说再见
- 从源码角度分析,为什么会发生Fragment重叠
- jQuery技术内幕:深入解析jQuery架构设计与实现原理. 2.5 jQuery.clean( elems, context, fragment, scripts )
- Android Fragment用法知识点的讲解
- AndroidStudio制作底部导航栏以及用Fragment实现切换功能
- AndroidStudio制作底部导航栏以及用Fragment实现切换功能
- AndroidStudio制作底部导航栏以及用Fragment实现切换功能
- Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
- Viewpager+Fragment 跳转Activity报错android.os.TransactionTooLargeException: data parcel size xxxxx bytes
- Fragment嵌套Fragment时候。子类fragment调用父容器Fragment方法
- 架构师成长之路-基于android fragment通信的面向对象的万能接口
- 【Android开发】之Fragment与Acitvity通信
- 关于Android中Fragment静态和动态加载的方法