@shjanken
2017-02-22T14:02:02.000000Z
字数 1557
阅读 756
mooc 交流
老师你好:
我学习了您在 imooc 上的课程 《组件化开发完整 AndroidApp 开发同时封装出通用 SDK》,刚刚上完了第一部分的课程。
我看到您的 HomeActivity 代码中,为了显示 Fragment 有如下代码:
if (mMineFragment == null) {mMineFragment = new MineFragment();fragmentTransaction.add(R.id.content_layout, mMineFragment);} else {mCurrent = mMineFragment;fragmentTransaction.show(mMineFragment);}
因为要显示3个Fragment,所以以上代码写了3遍,但只有微小不同。本着相同代码最多只些两遍的原则,所以我想把这部分代码抽象出来。
首先我抽象出一个接口,这个接口是为了实例化特定的 Fragment类,代码如下:
public interface FragmentCreator<T extends Fragment> {T createFragment();}
然后我在 BaseActivity 中添加了显示 Fragment 的套路代码:
protected Fragment displayFragment(Fragment currentFragment, Fragment fragment, FragmentCreator creator) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();if(currentFragment != null ) {transaction.hide(currentFragment);}Log.d(TAG, (fragment != null) ? "not null" : "null");if(fragment == null){fragment = creator.createFragment();// 因为 Fragment 都是现实在同一位置// 所以直接使用了 content_layouttransaction.add(R.id.content_layout, fragment);} else {transaction.show(fragment);}transaction.commit();return fragment;}}
这样一来我就将创建显示Fragment 的代码抽取出来了。
然后我在HomeActivity中具体如下使用这些代码
...@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.home_layout_view:displayHomeFragment();break;case R.id.message_layout_view:displayMessageFragment();break;}}...private void displayHomeFragment() {displayFragment(mCurrentFragment, mHomeFragment,new FragmentCreator<HomeFragment>() {@Overridepublic HomeFragment createFragment() {mHomeFragment = new HomeFragment();return mHomeFragment;}});setCurrentFragment(mHomeFragment);}... //创建其他的 Fragment
经过测试,切换什么都正常。
最后谢谢老师的辛苦付出,为我们带来这么好的课程。