1、首先,我这里的Fragment切换使用的是TabLayout与ViewPage结合的方式,当然也可以采用另一种使用FrameLayout作为子布局,然后根据要求调用replace方法,或者hide和show方法结合,这里只讲述TabLayout与ViewPage结合的方式,作为记录。
2、当时的情景大致是:在ListView(此ListView处于第三个Fragment)的某个item中的EditText输入信息后,切换到第一个Fragment后,再次切回来,发现数据全没了,如果是从第三个Fragment切换到第二个Fragment再切回来,数据还在。之前考虑过是不是要调用setText数据才不会消失,但是当时项目中给EditText设置了addTextChangeListener,调用setText又会触发该方法,然后又按照网上的方法弄了一下,还是不行。
3、最后,发现是切换时,Fragment会被销毁然后再重新创建,这跟使用TabLayout与ViewPage结合的方式有关,使用viewpage切换时,会在加载当前fragment的同时预加载下一个fragment,当切换到第三个fragment时又会将第一个fragment销毁,再次切换到第一个fragment会重新创建该fragment,预加载第二个fragment,第三个fragment则会被销毁,切换到第二个fragment或第三个fragment时,第三个fragment都会被重新创建,问题就出现在这里。
4、上述已经确定了问题就是fragment被销毁后重新创建,想要解决该问题也很简单,就是在切换时不让它销毁fragment(fragment少时可以采用,fragment太多不销毁会占用内存,此处只讨论fragment少的情况),只需在继承FragmentPagerAdapter时重写destroyItem,注释掉调用父类方法即可。
5、或者通过调用setOffscreenPageLimit()方法,从而设置ViewPager预加载的fragment数量。此处因为我是在三个fragment之间切换,所以设置值为2,通过调用setOffscreenPageLimit(2)后,我这里三个fragment会一次全部加载完成,切换过程中不会再次加载。
6、本篇文章只用于记录自己在学习中遇到的问题及解决方法,适用范围小,其他情况下不一定适用,仅做参考。