Android的fragment页面切换优化笔记

闲谈

最近我在做一个小项目,在空余的时间想怎么样的学习效率是最快的,我在观察别人的同时也问了下自己,应该是和水平相似甚至比你高一点点的人学习效率是最快的,让那个人告诉我他的经验,自己就不用折腾了。
那假如每个人都这样想,感觉折腾那个人才是最蠢的。
是么。
折腾+互相分享才是最快的。

优化

原来切换fragment的代码

1
2
3
4
5
6
public void replaceFragment(Fragment targetFragment){
FragmentManager fragmentManager=getSupportFragmentManager();
FragmentTransaction transaction=fragmentManager.beginTransaction();
transaction.replace(R.id.first_main,targetFragment);
transaction.commit();
}

这种方法会每次replace会把生命周期全部执行一遍,如果在这些生命周期函数 里拉取数据的话,就会不断重复的加载刷新数据,不停的切换就会卡顿。

正确方法是fragment页面切换用add(),hide()和show()

1
2
3
4
5
6
7
8
9
10
11
12
13
public void replaceFragment(Fragment targetFragment){
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
if (!targetFragment.isAdded()) {
if(currentFragment != null) {
transaction.hide(currentFragment).add(R.id.first_main, targetFragment).commit();
}else {
transaction.add(R.id.first_main, targetFragment).commit();
}
} else {
transaction.hide(currentFragment).show(targetFragment).commit();
}
currentFragment = targetFragment;
}

问题

看起来很完美,实际体验也好了很多,但是只要你把这个app放到后台一段时间再操作就会出现fragment重叠现象。

原因

当系统内存不足,Fragment 的宿主 Activity 回收的时候,Fragment 的实例并没有随之被回收。Activity 被系统回收时,会主动调用 onSaveInstance() 方法来保存视图层(View Hierarchy),所以当 Activity 通过导航再次被重建时,之前被实例化过的 Fragment 依然会出现在 Activity 中,此时的 FragmentTransaction 中的相当于又再次 add 了 fragment 进去的,hide()和show()方法对之前保存的fragment已经失效了,所以就出现了重叠。

解决

重新onSaveInstanceState()就不会保存之前的 fragment state了

1
2
3
4
@Override
protected void onSaveInstanceState(Bundle outState) {
//super.onSaveInstanceState(outState);
}

刷新数据的问题

1
2
3
4
5
6
7
8
9
@Override
public void onHiddenChanged(boolean hidden) {
// TODO Auto-generated method stub
super.onHiddenChanged(hidden);
//这里写返回刷新的语句
if (!hidden) {
firstRefresh();
}
}