BaseActivity/BaseFragment
封装的时候,我们需要设置泛型,传入对应的 Presenter
以及对应的 ViewBinding
;最后再继承 BaseView
这个接口
在页面创建和销毁的时候,我们需要对应的做相关的绑定和解绑,这其中除了对 Presenter
层进行绑定,还对 EventBus
做了对应的绑定。这是由于 EventBus
的订阅多会用于 UI 的更新,我们在这两个 Base
类做订阅的注册判断是有必要的;后续的子类想要使用,只需要在写上 @BindEventBus
的注解即可。
关于 EventBus 的封装,可以查看 EventBus封装到项目架构
public abstract class BaseActivity<P extends BasePresenter<? extends BaseView>,VB extends ViewBinding> extends AppCompatActivity implements BaseView{ private VB binding; /** * presenter层的引用 */ protected P presenter; /** * 错误 * * @param bean 错误信息 */ @Override public void onErrorCode(BaseBean bean) { ToastUtil.showToast(bean.msg); } /** * 初始化presenter,也是与Activity的绑定 * * @return 返回new的Presenter层的值 */ protected abstract P createPresenter(); /** * 载入view的一些操作 */ protected abstract void initView(); /** * 载入数据操作 */ protected abstract void initData(); /** * {@inheritDoc} * <p> * Perform initialization of all fragments. * * @param savedInstanceState */ @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(this.getClass().isAnnotationPresent(BindEventBus.class)){ EventBus.getDefault().register(this); } UltimateBarX.statusBarOnly(this) .light(true) .transparent() .apply(); //强制使用竖屏 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); binding = ViewBindingUtil.inflateWithGeneric(this, getLayoutInflater()); setContentView(binding.getRoot()); presenter = createPresenter(); initView(); initData(); } /** * 解除presenter与Activity的绑定 */ @Override protected void onDestroy() { super.onDestroy(); if(this.getClass().isAnnotationPresent(BindEventBus.class)){ EventBus.getDefault().unregister(this); } if (presenter != null){ presenter.detachView(); } } @Override public void showLoading() { MyUtil.showLoading(this); } @Override public void SuccessHideLoading() { MyUtil.dismissSuccessLoading(); } @Override public void FailedHideLoading() { MyUtil.dismissFailedLoading(); } /** * 查看当前是否为深色模式 * * @param context 传入当前context * @return 返回ture 偶然false */ public Boolean getDarkModeStatus(Context context){ int mode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; return mode == Configuration.UI_MODE_NIGHT_YES; } protected VB getBinding() { return binding; } } 复制代码
public abstract class BaseFragment<P extends BasePresenter,VB extends ViewBinding> extends Fragment implements BaseView { protected Context mContext; protected P presenter; private VB binding; /** * 显示加载中 */ @Override public void showLoading() { MyUtil.showLoading(mContext); } /** * 操作成功隐藏dialog和显示成功 */ @Override public void SuccessHideLoading() { MyUtil.dismissSuccessLoading(); } /** * 操作失败隐藏dialog和显示失败 */ @Override public void FailedHideLoading() { MyUtil.dismissFailedLoading(); } /** * 创建 presenter * * @return presenter */ protected abstract P createPresenter(); /** * 在这里要返回view的根路径 * * @return 返回绑定的view */ protected VB getBinding() { return binding; } /** * 初始化布局 */ protected abstract void initView(); /** * 初始化数据 */ protected abstract void initData(); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { if(this.getClass().isAnnotationPresent(BindEventBus.class)){ EventBus.getDefault().register(this); } binding = ViewBindingUtil.inflateWithGeneric(this, inflater, container, false); //得到context,在后面的子类Fragment中都可以直接调用 mContext = ActivityUtil.getCurrentActivity(); presenter = createPresenter(); initView(); initData(); return binding.getRoot(); } @Override public void onResume() { super.onResume(); initListener(); } @Override public void onDestroyView() { super.onDestroyView(); if(this.getClass().isAnnotationPresent(BindEventBus.class)){ EventBus.getDefault().unregister(this); } //销毁时,解除绑定 if (presenter != null) { presenter.detachView(); } binding = null; } private void initListener() { } @Override public void onErrorCode(BaseBean bean) { } } 复制代码
至此,MVP 的封装就完成了