[关闭]
@shjanken 2017-02-22T14:02:02.000000Z 字数 1557 阅读 756

我的 IMoocApplication 抽象方案

mooc 交流


老师你好:

我学习了您在 imooc 上的课程 《组件化开发完整 AndroidApp 开发同时封装出通用 SDK》,刚刚上完了第一部分的课程。
我看到您的 HomeActivity 代码中,为了显示 Fragment 有如下代码:

  1. if (mMineFragment == null) {
  2. mMineFragment = new MineFragment();
  3. fragmentTransaction.add(R.id.content_layout, mMineFragment);
  4. } else {
  5. mCurrent = mMineFragment;
  6. fragmentTransaction.show(mMineFragment);
  7. }

因为要显示3个Fragment,所以以上代码写了3遍,但只有微小不同。本着相同代码最多只些两遍的原则,所以我想把这部分代码抽象出来。

首先我抽象出一个接口,这个接口是为了实例化特定的 Fragment类,代码如下:

  1. public interface FragmentCreator<T extends Fragment> {
  2. T createFragment();
  3. }

然后我在 BaseActivity 中添加了显示 Fragment 的套路代码:

  1. protected Fragment displayFragment(Fragment currentFragment, Fragment fragment, FragmentCreator creator) {
  2. FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  3. if(currentFragment != null ) {
  4. transaction.hide(currentFragment);
  5. }
  6. Log.d(TAG, (fragment != null) ? "not null" : "null");
  7. if(fragment == null){
  8. fragment = creator.createFragment();
  9. // 因为 Fragment 都是现实在同一位置
  10. // 所以直接使用了 content_layout
  11. transaction.add(R.id.content_layout, fragment);
  12. } else {
  13. transaction.show(fragment);
  14. }
  15. transaction.commit();
  16. return fragment;
  17. }
  18. }

这样一来我就将创建显示Fragment 的代码抽取出来了。

然后我在HomeActivity中具体如下使用这些代码

  1. ...
  2. @Override
  3. public void onClick(View v) {
  4. switch (v.getId()) {
  5. case R.id.home_layout_view:
  6. displayHomeFragment();
  7. break;
  8. case R.id.message_layout_view:
  9. displayMessageFragment();
  10. break;
  11. }
  12. }
  13. ...
  14. private void displayHomeFragment() {
  15. displayFragment(mCurrentFragment, mHomeFragment,
  16. new FragmentCreator<HomeFragment>() {
  17. @Override
  18. public HomeFragment createFragment() {
  19. mHomeFragment = new HomeFragment();
  20. return mHomeFragment;
  21. }
  22. });
  23. setCurrentFragment(mHomeFragment);
  24. }
  25. ... //创建其他的 Fragment

经过测试,切换什么都正常。

最后谢谢老师的辛苦付出,为我们带来这么好的课程。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注