在有很多的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);
}
}