App应用中遇到Fragment经常会这样写
public void click1(View v){
//把fragment1的界面显示到帧布局中
//创建fragment对象
Fragment1 fg1 = new Fragment1();
//获取fragment管理器
FragmentManager fm = getFragmentManager();
//打开事务
FragmentTransaction ft = fm.beginTransaction();
//把内容显示到帧布局
ft.replace(R.id.fl, fg1);
//提交
ft.commit();
}
public void click2(View v){
//把fragment1的界面显示到帧布局中
//创建fragment对象
Fragment2 fg2 = new Fragment2();
//获取fragment管理器
FragmentManager fm = getFragmentManager();
//打开事务
FragmentTransaction ft = fm.beginTransaction();
//把内容显示到帧布局
ft.replace(R.id.fl, fg2);
//提交
ft.commit();
}
public void click3(View v){
//把fragment1的界面显示到帧布局中
//创建fragment对象
Fragment3 fg3 = new Fragment3();
//获取fragment管理器
FragmentManager fm = getFragmentManager();
//打开事务
FragmentTransaction ft = fm.beginTransaction();
//把内容显示到帧布局
ft.replace(R.id.fl, fg3);
//提交
ft.commit();
}
基础更好一点的同学会用show和hide方法
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(new FirstFragment())
.show(new SecondFragment())
.commit();
诚然这两种都可以切换Fragment,但是面对用户大量点击来回切换,或者你的Fragment本来就很多,每次都这样操作,那么很快你的应用就会OOM,就算不崩那也会异常的卡顿.
优化方案
方案一:
预加载模式
//首先需要先实例好三个全局Fragment
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment, FirstFragment.getInstance());
ft.add(R.id.fragment, SecondFragment.getInstance());
ft.add(R.id.fragment, ThirdFragment.getInstance());
ft.hide(SecondFragment.getInstance());
ft.hide(ThirdFragment.getInstance());
ft.commit();
在加载第一个Fragment时就把全部Fragment加载好,下次使用直接调用如:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(FirstFragment.getInstance())
.show(SecondFragment.getInstance())
.commit();
是不是总觉怪怪的,虽然比之前的代码好,当然还有更好的方法,就是动态加载,
方案二:
动态加载
下面的代码就是动态加载切换不同的Fragment
//(全局)
private Fragment currentFragment = fg1;
private FragmentTransaction switchFragment(Fragment targetFragment) {
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
if (!targetFragment.isAdded()) {
//第一次使用switchFragment()时currentFragment为null,所以要判断一下
if (currentFragment != null) {
transaction.hide(currentFragment);
}
transaction.add(R.id.fl, targetFragment,targetFragment.getClass().getName());
} else {
transaction.hide(currentFragment).show(targetFragment);
}
currentFragment = targetFragment;
return transaction;
}
需要使用的时候,点击Fragment条目的时候动态切换了
rb_fengyun.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchFragment(fg1).commit();
}
});
rb_youxi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchFragment(fg2).commit();
}
});
rb_biaosheng.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchFragment(fg3).commit();
}
});
rb_xinpin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchFragment(fg4).commit();
}
});