超级封装让你的项目搭建事半功倍 - 单 Activity 多 Fragment 模式

3,295 阅读5分钟

前言

上篇文章介绍了单Activity多Fragment模式去构建一个项目的简单框架,这种模式可以带给我们诸多好处。如果没有看过建议先看看这篇文章单Activity多Fragment模式快速构建一个App。本篇我将在上一篇那个模式的基础上对这个app里面的一些类进行封装,可以让我们的项目搭建事半功倍,效率更高。源码在已经上传到github,地址:SimpleApp。如果喜欢请多多支持多多star。

概括

  • BaseFragment和ContentPage类

    只要继承这个basefragment,子类就可以实现数据加载时不同的三种状态:加载中,加载成功,加载失败。并且定义了一个pdLoading的progressbar在我们请求网络时的进度条

  • BasePagerFragment

    定义了三个方法,子类只需要实现三个方法就可以实现上面那种的效果,并且可扩展性非常强。

  • BaseListFragment

    只要是列表类的界面都可以继承这个界面,这个类继承了上拉刷新、加载更多、封装了Adapter等功能。非常方便。

基类用法和效果

在这里我给大家讲一下他们的用法和效果,至于原理和如何封装,因为篇幅问题我在这里不再过多的阐述了,大家可以下载源码SimpleApp查看,里面的注释已经写的很清楚了,并且代码也比较简单,主要是一种封装思路,有不懂的可以加我qq和我交流。

一、BaseFragment

这两个的搭配我是从大黑马的教程中学来的,经过了我的一些改造,更加适应实际的项目需要。其中有一个ContentPage类是一个自定义的fragmLayout类,这个类包含了三种状态布局。而BaseFragment是一个根Fragment,在这个Fragment中的onCreateView方法中每次都会返回一个ContentPage的FramLayout布局,而在ContentPage类里面会根据实际请求网络的结果去加载不同的状态,加载中,加载失败,加载成功。如果下图所示。

这里写图片描述

    /**
     * 返回据的fragment填充的具体View,就是数据请求成功,正常显示的内容
     */
    protected abstract View getSuccessView();

    /**
     * 返回请求服务器的数据,一般在这个方法里面去做请求网络的操作
     */
    protected abstract Object requestData();

    /**
     * 当数据请求成功后或者失败后调用这个方法,刷新当前的View(是成功的还是失败的)
     */
    public void refreshPage(Object o){
        contentPage.refreshPage(o);
    }
public class MeFragment extends BaseFragment {

    @Override
    protected Object requestData() {
        
        getdateFromServer(){

            onFailed(){
                refreshPage(ConstantUtils.STATE_FAILED);
            }

            onSuccess(){
                refreshPage(ConstantUtils.STATE_SUCCESSED);
            }
        }
        return ConstantUtils.STATE_LOADING;
    }

    @Override
    protected View getSuccessView() {
        
        ....
        return view;
    }
    @Override
    public void onClick(View v) {

    }
}

二、BasePagerFragment

如果你的界面中类似下面的这种界面比较多的话,那么使用这个base类可以让你事半功倍。

这里写图片描述

类似上面这种界面,使用父Fragment + ViewPager + TabPagerIndicator + 多个子Fragment就可以实现,并且我对父Fragment进行了封装,使得这种模式的实现更加的简单。

如何使用?

  1. 定义一个承载多个子Fragment的父Fragment并且继承BasePagerFragment。
  2. 在FragmentFactory中准备好一个小工厂给父Fragment生产子Fragment。
  3. 在资源文件string.xml文件中准备好一个标题数组。

如果要添加一个滑动界面怎么办?

如果后期项目要新添加一个这种tab界面,我们只需要
1. 在FragmentFactory的小工厂中再添加一个新的这个界面Fragment对象
2. 在资源文件的数组中再添加一个item标签

然后我们只需要去实现的这个新添加的子Fragment具体内容就好了。如果要删除同增加一样。

具体的实现

1. BasePagerFragment的封装

其中对TabPageIndicator的使用请参考我的另一篇博文:仿今日头条最强顶部导航指示器,支持6种模式这里我将ViewPager和TabIndicator以及ViewPagerAdapter统一进行了实现,我将每个具体的界面所需要的标题(收费统计,车次统计,收入分析,车次分析)定义了一个抽象方法让子类具体去实现。而每个标题所对应的具体Fragment的对象也定义了一个抽象的方法具体的让子类实现。代码比较简单就不再粘贴了,大家下载源码看看就懂了,源码:SimpleApp

2. 承载多个子Fragment的父Fragment

看看是不是很简单,就三个方法

public class DataCenterFragment extends BasePagerFragment {

    @Override
    protected Fragment setFragment(int position) {
        return FragmentFactory.createForData(position);
    }

    @Override
    protected String[] setTitles() {
        return CommonUtils.getStringArray(R.array.data_center);
    }

    @Override
    protected void setActionBar() {
        ClickButtonActivity activity = (ClickButtonActivity) getActivity();
        activity.tvTitle.setText("数据中心");
    }
}

3. 在FragmentFactory定义好具体的子Fragment对象

在这个fragment工厂类中我们会根据传进来的不同参数返回不同的Fragment对象

    /**
     * 数据中心
     *
     * @param position
     * @return
     */
    public static Fragment createForData(int position) {
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new ChargeStatisticsFragment();
                break;
            case 1:
                fragment = new CarStatisticsFragment();
                break;
            case 2:
                fragment = new IncomeAnalysisFragment();
                break;
            case 3:
                fragment = new CarAnalysisFragment();
                break;
        }
        return fragment;
    }

4. 在资源文件strings.xml文件中定义标题数组


    ....
    
    
        收费统计
        车次统计
        收入分析
        车次分析
    

三、BaseListFragment

同BasePagerFragment一样,我将adapter、上拉刷新、加载更多等方法进行了封装。子类只需要继承这个类实现几个方法,就能搞定列表类的界面啦。省去了很多冗余代码。代码不贴了,看源码就行SimpleApp

1. 列表类的子类

具体实例可以参考项目SimpleApp中的shanyao.simpleapp.fragment.main.operation.UnusualOpenFragment

public class OutInRecordFragment extends BaseListFragment {
    /**
     * 在这个方法请求服务器数据
     */
    @Override
    protected Object requestData() {
        return null;
    }
    /**
     * 这个方法相当于BaseAdapter的getView方法
     */
    @Override
    protected View setView(int position, View convertView, ViewGroup parent) {
        return null;
    }
    /**
     * 刷新操作
     */
    @Override
    protected void setRefresh() {

    }
    /**
     * 加载更多操作
     */
    @Override
    protected void loadMore() {

    }

    /**
     * 设置actionBar
     */
    @Override
    protected void setActionBar() {

    }

    @Override
    public void onClick(View v) {

    }
}

总结

这几个封装加上我上一篇文章的单Activity多Fragment模式,我相信可以很快的搭建一个简单的app框架,这几个封装更多的是提供了一种封装思路,希望大家可以根据自己的实际需求定制。后续我会加入一些比较流行的网络框架,图片框架,热修复等等,使这个项目更加的完善。希望大家多多支持我,多多给我提些建议。最后别忘了去我的github里面star哈。
github地址:SimpleApp