<p id="brd13"></p>

      <rp id="brd13"></rp>

        <progress id="brd13"><menuitem id="brd13"></menuitem></progress>

            <ruby id="brd13"><th id="brd13"></th></ruby>

            记录一次代码演变过程——35行变24行

            Android编程精选 Android编程精选

            Linux编程
            点击右侧关注,免费入门到精通!


            作者丨鹏小轩
            http://www.jianshu.com/p/c1af336d29cc


            1 最初的实现


            一般Android应用首?#36710;?#37096;都分几个tab模块,点击一个tab就跳转到相应的功能点模块去,所以代码里一般都会有一个方法pageTo(),如下:


            private void pageTo(int pageIndex{
                if (pageIndex == mCurrentPage) return;
                mCurrentPage = pageIndex;

                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                hideFragment(transaction);

                switch (pageIndex) {
                    case PAGE_POSITION_HOME:
                        if (mHomeFragment == null) {
                            mHomeFragment = new HomeFragment();
                            transaction.add(R.id.fragment_container, mHomeFragment);
                        } else {
                            transaction.show(mHomeFragment);
                        }
                        transaction.commit();
                        break;

                    case PAGE_POSITION_MESSAGE:
                        if (mMessageFragment == null) {
                            mMessageFragment = new MessageFragment();
                            transaction.add(R.id.fragment_container, mMessageFragment);
                        } else {
                            transaction.show(mMessageFragment);
                        }
                        transaction.commit();
                        break;

                    case PAGE_POSITION_PERSON:
                        if (mUserFragment == null) {
                            mUserFragment = new UserFragment();
                            transaction.add(R.id.fragment_container, mUserFragment);
                        } else {
                            transaction.show(mUserFragment);
                        }
                        transaction.commit();
                        break;
                }
            }


            咋一看,好像没有问题,但是总是觉?#27809;?#26377;重复的代码在里面。比如说,else里面的所?#26032;?#36753;其实重复的。上面的代码,我们认真分析就能够知道,一共做了两件事。


            第一,初始化fragment;
            第二,提交显示fragment。(这里可以提取出来)


            2 第二个版本


            顺着以上思路,我们很容易的编写?#35828;?#20108;个版本。


            private void pageTo(int pageIndex{
                if (pageIndex == mCurrentPage) return;
                mCurrentPage = pageIndex;

                FragmentTransaction transaction = getSupportFragmentManager()
                                   .beginTransaction();
                hideFragment(transaction);

                switch (pageIndex) {
                    case PAGE_POSITION_HOME:
                        showFragment(PAGE_POSITION_HOME, transaction, mHomeFragment);
                        break;

                    case PAGE_POSITION_MESSAGE:
                        showFragment(PAGE_POSITION_MESSAGE, transaction
                                  , mMessageFragment);
                        break;

                    case PAGE_POSITION_PERSON:
                        showFragment(PAGE_POSITION_PERSON, transaction
                                  , mUserFragment);
                        break;
                }
            }

            private void showFragment(int index, FragmentTransaction transaction
                        , BaseFragment fragment
            {
                if (fragment == null) {
                    // 当传入的fragment没有被初始化
                    if (index == PAGE_POSITION_HOME) {
                        fragment = mHomeFragment = new HomeFragment();
                    } else if (index == PAGE_POSITION_MESSAGE) {
                        fragment = mMessageFragment = new MessageFragment();
                    } else {
                        fragment = mUserFragment = new UserFragment();
                    }
                    transaction.add(R.id.fragment_container, fragment);

                } else {
                    transaction.show(fragment);
                }
                transaction.commit();
            }


            这个版本主要是提取出了初始化和显示fragment的代码,初始化已经没有办法更改得更加简单,显示fragment这段代码就可以共用起来。


            但是看到这里,发现另一个问题,就是在pageTo()和showFragment()这两个方法中,都对index进行了判断。其实是重复的,于是就有?#35828;?#19977;个版本。


            3 第三版本


            private SparseArray fragmentMap = new SparseArray<>();

            private void pageTo(int pageIndex{
                if (pageIndex == mCurrentPage) return;
                mCurrentPage = pageIndex;

                FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                hideFragment(transaction);

                showFragment(pageIndex, transaction, fragmentMap.get(pageIndex));

            }

            private void showFragment(int index, FragmentTransaction transaction, BaseFragment fragment{
                if (fragment == null) {
                    // 当传入的fragment没有被初始化
                    if (index == PAGE_POSITION_HOME) {
                        fragment = mHomeFragment = new HomeFragment();
                    } else if (index == PAGE_POSITION_MESSAGE) {
                        fragment = mMessageFragment = new MessageFragment();
                    } else {
                        fragment = mUserFragment = new UserFragment();
                    }
                    transaction.add(R.id.fragment_container, fragment);
                    // 缓存住已经初始化的fragment,以便点击tab时传入到此方法?#23567;?/span>
                    fragmentMap.put(index, fragment);

                } else {
                    transaction.show(fragment);
                }
                transaction.commit();
            }


            利用集合来缓存住 fragment,这样就可以省去一次判断。到此,大功告成,代码瞬间感觉清爽了许多,迷之缩进也少了。


            精雕细琢,就是你思考行走的路径。


             推荐↓↓↓ 

            ????16个技术公众号】都在这里!

            涵盖:程序员大咖、源码共读、程序员共读、数据结构与算法、黑客技术和网络安全、大数据科技、编程前端、Java、Python、Web编程开发、Android、iOS开发、Linux、数据库研发、幽默程序员?#21462;?/span>

            万水千山总是情,点个 “好看” 行不行
            推荐
            球探网足球即时比分app
            <p id="brd13"></p>

                <rp id="brd13"></rp>

                  <progress id="brd13"><menuitem id="brd13"></menuitem></progress>

                      <ruby id="brd13"><th id="brd13"></th></ruby>

                      <p id="brd13"></p>

                          <rp id="brd13"></rp>

                            <progress id="brd13"><menuitem id="brd13"></menuitem></progress>

                                <ruby id="brd13"><th id="brd13"></th></ruby>