以下是个人观点,欢迎指正!
最近项目中使用FragmentTabHost,有些心得跟大伙分享下。
好多人苦恼“使用FragmentTabHost的时候,Fragment不能保持状态,每次都会刷新画面“,最近试验发现:
在切换FragmentTabHost的标签的时候,确实每次都触发一遍Fragment的生命周期函数,例如,onActivityCreated等,
而且,我们通常对Fragment的控件以及数据的初始化处理也是写到这些生命周期函数的,这样就导致了,每次重新获取数据,
并刷新画面的问题。
最近才注意到,FragmentTabHost切换Tab标签时,Fragment的实例是不变的,不会每次都new一个新的Fragment实例,这样,
Fragment实例中的成员变量(数据集合、控件的实例等)就是不变的,而且画面的表现也就是Fragment对应的View的实例也是
不变的(例如,listview滚动后停留在哪一行时,再次切换回这个Fragment时,还会停留在哪一行,前提数据集没有更新)。
所以,在使用FragmentTabHost的时候,对Fragment的控件和数据集的初始化处理就要注意了,既然数据集合、控件的实例没有变,
那么,在Fragment的生命周期函数中就没有必要再次赋值了,可以加上控件!=null时,才findViewById去赋值之类的处理。
另外,如果Fragment首次创建时,需要请求数据等处理的话,可以尝试着,把这些数据请求的处理放到FragmenHost所在的Activity的
onCreate等方法中,Activity的生命周期函数只会调用一次。如何把在Activity中请求的数据传递给Fragment的话,可以使用EventBus之类
的工具,形式不限。
以上。