[置顶] 超级封装让你的项目搭建事半功倍-单Activity多Fragment模式
封装,fragment2016-08-10
上篇文章介绍了单Activity多Fragment模式去构建一个项目的简单框架,这种模式可以带给我们诸多好处。如果没有看过建议先看看这篇文章单Activity多Fragment模式快速构建一个App。本篇我将在上一篇那个模式的基础上对这个app里面的一些类进行封装,可以让我们的项目搭建事半功倍,效率更高。源码在已经上传到github,地址:SimpleApp。如果喜欢请多多支持多多star。
BaseFragment和ContentPage类
只要继承这个basefragment,子类就可以实现数据加载时不同的三种状态:加载中,加载成功,加载失败。并且定义了一个pdLoading的progressbar在我们请求网络时的进度条
BasePagerFragment
定义了三个方法,子类只需要实现三个方法就可以实现上面那种的效果,并且可扩展性非常强。
BaseListFragment
只要是列表类的界面都可以继承这个界面,这个类继承了上拉刷新、加载更多、封装了Adapter等功能。非常方便。
在这里我给大家讲一下他们的用法和效果,至于原理和如何封装,因为篇幅问题我在这里不再过多的阐述了,大家可以下载源码SimpleApp查看,里面的注释已经写的很清楚了,并且代码也比较简单,主要是一种封装思路,有不懂的可以加我qq和我交流。
这两个的搭配我是从大黑马的教程中学来的,经过了我的一些改造,更加适应实际的项目需要。其中有一个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(){// 如果网络请求成功了,就加载成功的界面,然后就会执行getSuccessView()方法
refreshPage(ConstantUtils.STATE_SUCCESSED);
}
}
return ConstantUtils.STATE_LOADING;// 在网络请求的同时加载,加载中的界面。
}
@Override
protected View getSuccessView() {
// 这个方法相当普通Fragment的onCreateView()方法
....
return view;
}
@Override
public void onClick(View v) {
}
}
如果你的界面中类似下面的这种界面比较多的话,那么使用这个base类可以让你事半功倍。
类似上面这种界面,使用父Fragment + ViewPager + TabPagerIndicator + 多个子Fragment就可以实现,并且我对父Fragment进行了封装,使得这种模式的实现更加的简单。
如果后期项目要新添加一个这种tab界面,我们只需要
1. 在FragmentFactory的小工厂中再添加一个新的这个界面Fragment对象
2. 在资源文件的数组中再添加一个item标签
然后我们只需要去实现的这个新添加的子Fragment具体内容就好了。如果要删除同增加一样。
其中对TabPageIndicator的使用请参考我的另一篇博文:仿今日头条最强顶部导航指示器,支持6种模式这里我将ViewPager和TabIndicator以及ViewPagerAdapter统一进行了实现,我将每个具体的界面所需要的标题(收费统计,车次统计,收入分析,车次分析)定义了一个抽象方法让子类具体去实现。而每个标题所对应的具体Fragment的对象也定义了一个抽象的方法具体的让子类实现。代码比较简单就不再粘贴了,大家下载源码看看就懂了,源码:SimpleApp
看看是不是很简单,就三个方法
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("数据中心");
}
}
在这个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;
}
<resources>
....
<!--数据中心-->
<array name="data_center">
<item>收费统计</item>
<item>车次统计</item>
<item>收入分析</item>
<item>车次分析</item>
</array>
</resources>
同BasePagerFragment一样,我将adapter、上拉刷新、加载更多等方法进行了封装。子类只需要继承这个类实现几个方法,就能搞定列表类的界面啦。省去了很多冗余代码。代码不贴了,看源码就行SimpleApp。
具体实例可以参考项目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