在我们项目的开发中,少不了使用到Fragment,我们控制Fragment的切换有两种,第一种是replace,另一种hide和show,这两种有什么区别呢?
ps:在开发过程中,我发现有些代码里,在replace的时候,一直在new我们的Fragment,这样是不好的,我们应该在第一次创建的时候,将这些初始化好的Fragment放在我们创建的Fragmentlist中:
private List<Fragment> fragmentList = new ArrayList<>();
//创建Fragment并放入集合
HomeFragment homeFragment = new HomeFragment();
ClientFragment clientFragment = new ClientFragment();
TeamFragment teamFragment = new TeamFragment();
ComFragment comFragment = new ComFragment();
ShowMessageFragment showMessageFragment = new ShowMessageFragment();
fragmentList.add(homeFragment);
fragmentList.add(clientFragment);
fragmentList.add(teamFragment);
fragmentList.add(comFragment);
fragmentList.add(showMessageFragment);
首先我们看一下Fragmnet的replace的写法:
ps:fl 为占位布局的id,方法中需要传递Fragment的对象进去。
//Fragment替换方法
public void replace(Fragment fragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.fl, fragment);
transaction.commit();
}
这种写法,会重新加载Fragment,那么这个时候,他里面的生命周期和方法就会再次运行,而我们往往不希望这样的事情发生,那么我们就需要使用到下面的方法:
private Fragment current_fragment;
//fragment的方法
private void startFragmentAdd(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
if (current_fragment == null) {
fragmentTransaction.add(R.id.fl, fragment).commit();
current_fragment = fragment;
}
if (current_fragment != fragment) {
// 先判断是否被add过
if (!fragment.isAdded()) {
// 隐藏当前的fragment,add下一个到Activity中
fragmentTransaction.hide(current_fragment).add(R.id.fl, fragment).commit();
} else {
// 隐藏当前的fragment,显示下一个
fragmentTransaction.hide(current_fragment).show(fragment).commit();
}
current_fragment = fragment;
}
}
我们仔细品味一下这个方法,他依靠Fragment的hide和show,实现了Fragment的切换,这种方式,我们的Fragment不会被重新加载。
注:在使用Hide和Show方法时,我们会遇到Fragment点击穿透的情况,这个时候,我们需要在我们的Fragment的布局的根下加入:clickable="true"
我本人还是推荐不用replace而是使用第二种方法。