美文网首页Android开发Android开发经验谈
记录一次代码演变过程——35行变24行

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

作者: 一盘好书 | 来源:发表于2019-03-14 11:09 被阅读5次

Android实现首页过程中,fragment与activity的结合使用是很常见的一种方式,本文主要其中很小的一个点——显示fragment的逻辑,另外感谢同事小武同学对代码孜孜不倦的探究精神。

1 最初的实现

一般Android应用首页底部都分几个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;
    }
}

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

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

2 第二个版本

顺着以上思路,我们很容易的编写了第二个版本。

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进行了判断。其实是重复的,于是就有了第三个版本。

3 第三版本

private SparseArray<BaseFragment> 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时传入到此方法中。
        fragmentMap.put(index, fragment);

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

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


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

相关文章

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

    1 最初的实现 一般Android应用首页底部都分几个tab模块,点击一个tab就跳转到相应的功能点模块去,所以代...

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

    Android实现首页过程中,fragment与activity的结合使用是很常见的一种方式,本文主要其中很小的一...

  • 记录变美过程

    今天开始了我的护肤化妆学习之路 开始了解化妆工具 1,隔离分为紫色、绿色、白色、蓝色、金色、肤色等 普通肤色和...

  • 记录变美过程二

    今天开始了我的第二节变美课程。简单的护肤加上整妆指导! 护肤 脸上皮肤分为油性,中性,干性。脸上皮肤有几种...

  • java8

    2.行为参数化传递代码 2.1 演变过程 2.1.1 筛选绿色苹果 改进:筛选红色苹果 2.1.2 颜色作为参数 ...

  • stf from openstf to DeviceFarmer

    记录一次debug过程看起来是同步代码遇到的问题,顺手查一下STF的最新代码,发现这个仓库已经存档了。 opens...

  • jQuery引入细节

    题目:按照课程内容,补全下面的代码,并记录实现过程 完整代码: HTML CSS JS 细节记录: https:/...

  • iOS笔记-记录一次内存泄漏发现过程

    iOS笔记-记录一次内存泄漏发现过程 iOS笔记-记录一次内存泄漏发现过程

  • spring 设计模式篇—工厂模式

    一、解决了什么问题? 二、工厂模式演变过程,及代码实现demo 三、源-简单工厂 Car.java BmCar.j...

  • 遗传算法的神经网络python实现源码

    代码过程中,把代码过程较好的一些代码段记录起来,下边代码是关于遗传算法的神经网络python实现的代码,应该对大伙...

网友评论

    本文标题:记录一次代码演变过程——35行变24行

    本文链接:https://www.haomeiwen.com/subject/bogfmqtx.html