應(yīng)用場(chǎng)景 : 一個(gè)Activity嵌套3個(gè)Fragment f1,f2,f3
一般我們?cè)谇袚Q時(shí)都是使用
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
TestFragment fragment = new TestFragment ();
transaction.replace(R.id.layout, fragment );
transaction.commit();
但是 發(fā)現(xiàn)用replace()來(lái)切換Fragment會(huì)很好性能(也很浪費(fèi)流量), 每次切換時(shí)都需要重新創(chuàng)建Fragment ,這當(dāng)然不是我們希望看到的.
優(yōu)化 : 在Activity中創(chuàng)建一個(gè)方法
// 先創(chuàng)建 對(duì)應(yīng)的Fragment的實(shí)例 (全局)
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) {
// 獲取事物的實(shí)例
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
// 判斷此fragment是否添加
if (!targetFragment.isAdded()) {// 沒(méi)有添加
//注意 : 第一次使用switchFragment()時(shí)currentFragment為null蜈敢,所以要判斷一下
if (currentFragment != null) {
transaction.hide(currentFragment);
}
// 添加對(duì)應(yīng)的fragment
transaction.add(R.id.layout, targetFragment, targetFragment.getClass().getName());
} else {
transaction
.hide(currentFragment)
.show(targetFragment);
}
currentFragment = targetFragment;
return transaction;
}
在對(duì)應(yīng)的點(diǎn)擊事件中調(diào)用
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.f1:
switchFragment(f1).commit();// 記得要commit
break;
...// 后面的很簡(jiǎn)單了 一樣
}
}
這樣在切換時(shí)就只隱藏了對(duì)應(yīng)的fragment ,需要時(shí)直接顯示出來(lái)就行 .
還有許多不足之處, 歡迎大家一起探討.
ps : 問(wèn)題: 新項(xiàng)目中 需要其中的一個(gè)Fragment每次顯示時(shí)都要重新請(qǐng)求數(shù)據(jù)(類似電商的購(gòu)物車那種) ,其他幾個(gè)Fragment不需要重新請(qǐng)求 . 這很蛋疼啊 ,后面在 google了下 發(fā)現(xiàn)Fragment中還真有這個(gè)問(wèn)題的解決辦法
// 注意 : 此方法 在 Fragment中調(diào)用
// 隱藏和顯示切換時(shí)調(diào)用
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden) {
// 隱藏時(shí)調(diào)用 todo
} else {
// 顯示時(shí)調(diào)用 todo
}
}