Android主页动态添加Fragment
一般App的主页
项目结构
方案
通常我们的做法是在启动主页的MainActivity时,会一次把BusinessFragment、ExpoFragment、HomeFragment、MineFragment、NoticeFragment这五个Fragment一次加载到内存中。这样的话,会导致启动慢、OOM等问题。
我们改进一下,让启动MainActivity的时候不是一次把五个Fragment都加载到内存中,而是启动MainActivity的时候只加载首页的HomeFragment,其它的Fragment只有当我们点击的时候再加载。例如,当我们点击了活动后再加载活动的NoticeFragment,这样我们就达到了动态加载Fragment的目的。
核心代码
public class MainActivity extends AppCompatActivity {
private RadioGroup contentRadioGroup;
private List<Fragment> fragments;
private FragmentManager fragmentManager;
private FragmentTransaction transition;
private HomeFragment homeFragment;
private BusinessFragment businessFragment;
private ExpoFragment expoFragment;
private NoticeFragment noticeFragment;
private MineFragment mineFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
contentRadioGroup = (RadioGroup) findViewById(R.id.content_rg);
fragmentManager = getSupportFragmentManager();
fragments = new ArrayList<>();
// 添加首页
contentRadioGroup.check(R.id.content_rb_home);
homeFragment = new HomeFragment();
fragments.add(homeFragment);
hideOthersFragment(homeFragment, true);
contentRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.content_rb_home: // 首页
hideOthersFragment(homeFragment, false);
break;
case R.id.content_rb_expo: // 展会
if (expoFragment == null) {
expoFragment = new ExpoFragment();
fragments.add(expoFragment);
hideOthersFragment(expoFragment, true);
} else {
hideOthersFragment(expoFragment, false);
}
break;
case R.id.content_rb_notice: // 活动
if (noticeFragment == null) {
noticeFragment = new NoticeFragment();
fragments.add(noticeFragment);
hideOthersFragment(noticeFragment, true);
} else {
hideOthersFragment(noticeFragment, false);
}
break;
case R.id.content_rb_business: // 业务
if (businessFragment == null) {
businessFragment = new BusinessFragment();
fragments.add(businessFragment);
hideOthersFragment(businessFragment, true);
} else {
hideOthersFragment(businessFragment, false);
}
break;
case R.id.content_rb_mine: // 我的
if (mineFragment == null) {
mineFragment = new MineFragment();
fragments.add(mineFragment);
hideOthersFragment(mineFragment, true);
} else {
hideOthersFragment(mineFragment, false);
}
break;
default:
break;
}
}
});
}
/**
* 动态显示Fragment
*
* @param showFragment 要增加的fragment
* @param add true:增加fragment;false:切换fragment
*/
private void hideOthersFragment(Fragment showFragment, boolean add) {
transition = fragmentManager.beginTransaction();
if (add)
transition.add(R.id.main_container_content, showFragment);
for (Fragment fragment : fragments) {
if (showFragment.equals(fragment)) {
transition.show(fragment);
} else {
transition.hide(fragment);
}
}
transition.commit();
}
}