[置顶] 单Activity多Fragment模式快速构建一个App
架构,Fragment2016-08-09
自从出了Fragment之后,我便对它情有独钟。从我开始的学习,到现在我做了多个app,我一直在使用Fragment,并且形成了我自己的app架构模式“单Activity多Fragment”,即使用一个Activity多个Fragment去构建一个App的整体架构,这样的好处多多,接下来我会一一介绍。我记得我有一个App其中就3个Activity、100多个Fragment。我已经用这种方式实现4个app了,在经过多个app之后,我的这种模式也在一步步的完善,但是毕竟我自己的水平有限,所以其中也有好些不合理的地方,因此这次我将它分享出来,这次我仅仅做一些关于这个架构的解释说明,后续我会将一些比较热门的技术陆续加入(比如RxJava,retrofit等等),让这个app能够更加完善。希望大家能够多多star,同时更希望大家能够多多拍砖让我不断的进步。
github地址:SimpleApp
正如你上面看到的App,其中只有三个Activity,一个BaseActivity,一个MainActivity,一个ClickButtonActivity。看下项目截图
MainActivity+ViewPager+Fragment+RadioGroup实现底部导航栏
这里面比较简单就是给RadioGroup设置一个点击监听,然后根据点击的不同item设置ViewPager当前显示的Fragment界面,这里需要注意 viewpager.setCurrentItem(0, false)这个方法中的第二个参数,如果是true那么ViewPager会有切换动画,false则没有,大家可以试试看。还有这里我自定义了一个不可以滑动的ViewPager—NoScrollViewPager,这个大家可以根据实际需求设计。如果设置可以滑动的话,那么需要根据ViewPager的滑动去改变RadioButton的颜色。同样给ViewPager设置监听然后相应的改变RadioButton的值就好了。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initView();
}
private void initView() {
adapter = new MainPagerAdapter(getSupportFragmentManager());
viewpager.setAdapter(adapter);
viewpager.setOffscreenPageLimit(5);
viewpager.setCurrentItem(0);
homeTitle.setText("首页");
bottomMain.setChecked(true);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.bottom_main:
viewpager.setCurrentItem(0, false);
homeTitle.setText("首页");
break;
case R.id.bottom_park:
viewpager.setCurrentItem(1, false);
homeTitle.setText("停车场");
break;
case R.id.bottom_me:
viewpager.setCurrentItem(2, false);
homeTitle.setText("我");
break;
}
}
});
}
在任何通过点击跳转的界面,只需要在MainFragment里面的onClick方法里面添加下面一句话即可。
@Override
public void onClick(View v) {
StartUtils.startActivityById(getActivity(),v.getId());
}
怎么样是不是很简单?如果不是使用这种模式,而是使用传统的跳转不同的Activity那么写法你可以知道会有很多很多代码的,要是需要跳转的界面越多而需要的代码就会越多,比如下面的界面
public static void startActivityById(Context context, int resId){
Intent intent = new Intent(SYApplication.getContext(), ClickButtonActivity.class);
intent.putExtra("resId",resId);
context.startActivity(intent);
}
XML文件
这里可以统一所有跳转界面的ActionBar的风格,回退图标,界面标题,右侧文字和图片,我可以在Fragment中拿到这些参数的引用通过设置可见和不可见控制他们的显示,设置不同的界面标题等等ActionBar的操作。
/**
* 这些公共的变量我只需要在Fragment中通过getActivity方法获取这Activity的引用,便可以引用这些变量
*/
@Bind(R.id.tv_title)
public TextView tvTitle;// 公共的标题引用
@Bind(R.id.iv_right)
public ImageView ivRight;// 右侧文字的引用
@Bind(R.id.tv_right)
public TextView tvRight;// 右侧图片的引用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_click_button);
ButterKnife.bind(this);
// 获取传递过来的资源id值
intent = getIntent();
resId = intent.getIntExtra("resId", 0);
if (intent.getExtras() != null) {
resId = intent.getExtras().getInt("resId");
}
// 这里需要传递其他值可以自己定义
id = intent.getStringExtra("id");
/**
* 根据传递过来的不同的资源id值设置不同的fragment
*/
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
ft.replace(R.id.fl_click_button, FragmentFactory.createById(resId));
ft.commit();
// 统一设置返回功能
actionBarBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClickButtonActivity.this.finish();
}
});
}
在这个工厂类里面,根据传入进来的不同的资源id值返回不同Fragment的对象。
/**
* 根据资源id返回不同的fragment
*/
public static Fragment createById(int resId) {
Fragment fragment = null;
switch (resId) {
case R.id.home_operation_center:// 运营中心
fragment = new OperationCenterFragment();
break;
case R.id.home_consume_center:// 消费中心
fragment = new ConsumeCenterFragment();
break;
case R.id.home_manager_center:// 管理中心
fragment = new ManagerCenterFragment();
break;
case R.id.home_data_center:// 数据中心
fragment = new DataCenterFragment();
break;
}
return fragment;
}
类似上面这种界面,使用父Fragment + ViewPager + TabPagerIndicator + 多个子Fragment就可以实现,并且我对父Fragment进行了封装,使得这种模式的实现更加的简单。不过由于这篇文章的篇幅问题,我会在下一篇博客中详细介绍一些我封装的好的类。
这里先剧透一下下:
通过以上三种方法,我们就能实现单Activity多Fragment了,跟传统的写法相比,确实是有些优势的,简化了好些代码。我也用这种方式写了多个app,现在我分享出来,希望大家可以帮我参考下,多多提提意见,可以使我的app更加的完善。如果你认为这个对你有些帮助和启发,就请去我的github:SimpleApp里面 star一下多多支持我吧。谢谢大家。