Fragment销毁时replace和add两个方法的区别

Fragment销毁时replace和add两个方法的区别,第1张

我们都知道fragment切换有两种方式:

1. replace方式

transaction.replace(R.id.content, IndexFragment)

2. add-hide-show方式

transaction.add(R.id.content, IndexFragment) transaction.hide(otherfragment) transaction.show(thisfragment)

我们来分析下用add,hide,show为什么出现这种bug,我把每个 *** 作都打印出了以下日志:

复现bug的 *** 作是:

1.首先打开,默认选中的是第一个tab,如上面的一张图片正常那样。

2.切换到tab2,并把tab1 hide掉;

3.再切回到tab1,并不会触发tab1对应fragment的任何生命周期

4.然后home键进入后台,我在activity的onPause()中手动对IndexFragment赋空,模拟长时间后台,系统销毁了该引用。

IndexFragment=null

5.再次启动,其实tab1 的fragment实例在内存中还在,只是他的引用被销毁了。

6.再切到tab2,这里其实是先把tab1的hide,在show tab2,但是tab1 的fragment引用为空,所以无法hide,就出现了tab2叠在tab1上的花屏情况。

7.再切到tab1,tab1就会重复创建对象。

同样的 *** 作,我们使用replace的方式

使用上是没有区别的,Fragment是android3.0引入的新控件,如果项目本身就是4.0以上的话,那么可以直接引用app包下的。

1. Fragment是android3.0引入的新控件,果应用使用在3.0以下、1.6及以上的版本,需要引入v4包。

2. Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。

3. Fragment的生命周期方法依赖于Activity的生命周期,例如一个Activity的onPause()的生命周期方法被调用的时候这个Activity中的所有的Fragment的onPause()方法也将被调用。

4. FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的 *** 作。在Activity运行期间可以添加Fragment而不是在XML布局文件中进行定义。如果打算在Activity中改变Fragment的生命过程。如果要执行添加、删除、修改的 *** 作,必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些 *** 作。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11922575.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存