前言
日常开发中,每个 Activity、Fragment 中都有很多共同的部分,比如 Toast、ButterKnike、startActivity、初始化 init() 等。
其实可以根据 Activity 封装一个 BaseActivity,把 ButterKnike 抽取上去,把 注入对象 抽取上去:譬如 presenter 对象。还可以把 Component 抽取到父类(包括通用的 getApplication)。
这样做的目的就是一次封装,方便子类使用,不需要在每个 Activity、Fragment 中写总是写重复的代码了,把重复的工作都抽出来放在父类,自己就继承父类即可。
下面就项目中的封装简单介绍下如何封装 Activity、Fragment、Presenter.
Acitvity 的封装与使用
BaseActivity
继承 AppCompatActivity,重写 onCreate() 方法,并设置布局文件,但是这个布局应该由子类提供(每个 Activity 的布局都不一样),所以代码中定义一个抽象方法 setLayout() 给子类去实现,提供自己的布局。
其他由子类提供的东西,都可以在父类定义一个抽象方法,让子类实现即可。当然,该封装的 Activity 得声明为 abstract 类型的。
也可以提供一些常用的方法:startActivity()
另外,还可以把公共的东西抽取到父类 onCreate() 方法中,如:ButterKnife 控件绑定、Component 的注入。
public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity {
private Unbinder mUnbinder; //用于解除 butterknife 的绑定
private AppApplication mApplication; //很常用,不解释
@Inject
T mPresenter ; //把 Presenter 抽出来,泛型表示,因为每个子类需要的 presenter 都不确定
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
//字体图标的一些渲染
LayoutInflaterCompat.setFactory(getLayoutInflater(), new IconicsLayoutInflater(getDelegate()));
super.onCreate(savedInstanceState);
setContentView(setLayout());
mUnbinder = ButterKnife.bind(this);
this.mApplication = (AppApplication) getApplication(); //常用的东西直接在父类里面获取好,子类直接享用
setupAcitivtyComponent(mApplication.getAppComponent());
init(); //在父类留下公共的方法,让子类去实现
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mUnbinder !=Unbinder.EMPTY){
mUnbinder.unbind();
}
}
// protected void startActivity(Class c){