Fragment之間的切換

應(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()來切換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()) {// 沒有添加
            //注意 :  第一次使用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í)直接顯示出來就行 .
還有許多不足之處, 歡迎大家一起探討.

ps : 問題: 新項(xiàng)目中 需要其中的一個(gè)Fragment每次顯示時(shí)都要重新請(qǐng)求數(shù)據(jù)(類似電商的購物車那種) ,其他幾個(gè)Fragment不需要重新請(qǐng)求 . 這很蛋疼啊 ,后面在 google了下 發(fā)現(xiàn)Fragment中還真有這個(gè)問題的解決辦法

// 注意 : 此方法 在 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
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容