Fragment設計技巧

在有很多的app框架的架構中,越來越多的會經常使用Fragment,那麼今天我們我會講到如何設計Fragment

當我們使用一個MainActivity去包含多個Fragment的框架,這樣做的好處很明顯,靈活、節省內存、效率高,但是我們會經常使用到raplace(R.id.fl_container,new MyFragment())方法,注:R.id.fl_container是Framelayout的id名稱。

看了源碼後,是先執行了remove()方法,就是移除了所有添加的Fragment,然後將當前的要顯示的Fragment添加到容器中FrameLayout中。

首先我覺得這種方法有點耗內存了,因爲需要移除再去添加的操作,也就是從對象的銷燬–>然後創建新的對象。

然而當我再次的看到源碼時,可以看到有show()方法,hide()方法,是不是感覺到有新idea了。對的,我們可以對其Fragment進行先添加,以後就可以對其顯示和隱藏的操作,這樣就大大的節省內存的開支。具體的部分代碼如下:

 @Override
    public void setOnClickListener() {
        super.setOnClickListener();
        //對RadioGroup設置監聽
        rg_main.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                switch (checkedId) {
                    case R.id.rb_movie:
                        setTabSelection(0);
                        break;
                    case R.id.rb_cinema:
                        setTabSelection(1);
                        break;
                    case R.id.rb_find:
                        setTabSelection(2);
                        break;
                    case R.id.rb_mine:
                        setTabSelection(3);
                        break;
                }
            }
        });
    }

/**
 * 根據傳入的index參數來設置選中的tab頁
 */
@SuppressLint("CommitTransaction")
private void setTabSelection(int index) {
    //開啓一個Fragment事務
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    //隱藏所有的Fragment,因爲可以節省內存
    hideAllFragment(transaction);
    switch (index) {
        case 0:
            //判斷是否爲空
            if (movieFragment == null) {
                movieFragment = new MovieFragment();
                transaction.replace(R.id.fl_content,movieFragment);
                transaction.add(R.id.fl_content, movieFragment);
            } else {
                transaction.show(movieFragment);
            }
            break;
        case 1:
            if (cinemaFragment == null) {
                cinemaFragment = new CinemaFragment();
                transaction.add(R.id.fl_content, cinemaFragment);
            } else {
                transaction.show(cinemaFragment);
            }
            break;
        case 2:
            if (findFragment == null) {
                findFragment = new FindFragment();
                transaction.add(R.id.fl_content, findFragment);
            } else {
                transaction.show(findFragment);
            }
            break;
        case 3:
            if (mineFragment == null) {
                mineFragment = new MineFragment();
                transaction.add(R.id.fl_content, mineFragment);
            } else {
                transaction.show(mineFragment);
            }
            break;
    }
    transaction.commit();
}

/**
 * 隱藏掉所有的fragment,防止多個fragment顯示
 */
private void hideAllFragment(FragmentTransaction transaction) {
    if (movieFragment != null) {
        transaction.hide(movieFragment);
    }
    if (cinemaFragment != null) {
        transaction.hide(cinemaFragment);
    }
    if (findFragment != null) {
        transaction.hide(findFragment);
    }
    if (mineFragment != null) {
        transaction.hide(mineFragment);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章