应用场景 : 一个Activity嵌套3个Fragment f1,f2,f3
一般我们在切换时都是使用
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
TestFragment fragment = new TestFragment ();
transaction.replace(R.id.layout, fragment );
transaction.commit();
但是 发现用replace()来切换Fragment会很好性能(也很浪费流量), 每次切换时都需要重新创建Fragment ,这当然不是我们希望看到的.
优化 : 在Activity中创建一个方法
// 先创建 对应的Fragment的实例 (全局)
private Fragment currentFragment = new Fragment();
private F1 f1= new F1();
private F2 f2= new F2();
private F3 f3= new F3();
/**
* Fragment的切换 只隐藏
*/
private FragmentTransaction switchFragment(Fragment targetFragment) {
// 获取事物的实例
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
// 判断此fragment是否添加
if (!targetFragment.isAdded()) {// 没有添加
//注意 : 第一次使用switchFragment()时currentFragment为null,所以要判断一下
if (currentFragment != null) {
transaction.hide(currentFragment);
}
// 添加对应的fragment
transaction.add(R.id.layout, targetFragment, targetFragment.getClass().getName());
} else {
transaction
.hide(currentFragment)
.show(targetFragment);
}
currentFragment = targetFragment;
return transaction;
}
在对应的点击事件中调用
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.f1:
switchFragment(f1).commit();// 记得要commit
break;
...// 后面的很简单了 一样
}
}
这样在切换时就只隐藏了对应的fragment ,需要时直接显示出来就行 .
还有许多不足之处, 欢迎大家一起探讨.
ps : 问题: 新项目中 需要其中的一个Fragment每次显示时都要重新请求数据(类似电商的购物车那种) ,其他几个Fragment不需要重新请求 . 这很蛋疼啊 ,后面在 google了下 发现Fragment中还真有这个问题的解决办法
// 注意 : 此方法 在 Fragment中调用
// 隐藏和显示切换时调用
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
// 隐藏时调用 todo
} else {
// 显示时调用 todo
}
}