
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来执行这些 *** 作。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)