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