Android主页动态添加Fragment

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();
    }

}

项目源码

https://github.com/hfrommane/DynamicHome

发布了34 篇原创文章 · 获赞 12 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/hfrommane/article/details/76296924