天来说说MVP+DataBinding 的使用

 

以一个登录案例来讲解

 

 

 

布局:(ConstraintLayout 作为根布局)

                                                            

 BaseActivity.Java

public abstract class BaseActivity> extends AppCompatActivity{    protected D viewDataBinding;    protected T p;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        viewDataBinding = DataBindingUtil.setContentView(this, setMainLayout());        p = createPresenter();        p.attachView((V)this);        initView();        initBeforeData();    }    protected abstract T createPresenter();    /***     * 初始化布局     */    protected abstract int setMainLayout();    /**     * 初始化View     */    protected abstract void initView();    /**     * 初始化先前数据     */    protected abstract void initBeforeData();    /***     * 跳转Activity     * @param mClass     */    protected void openActivity(Class<?> mClass) {        openIntent(new Intent(this, mClass));    }    /**     * 弹出toast 显示时长short     *     * @param msg     */    protected void showToastShort(String msg) {        if (!TextUtils.isEmpty(msg)) {            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();        }    }    protected void showToastShort(int msg) {        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();    }    protected void openIntent(Intent intent) {        startActivity(intent);    }    protected void openForResultActivity(Intent intent, int requestCode){        startActivityForResult(intent,requestCode);    }    @Override    protected void onDestroy() {        super.onDestroy();        if (p != null){            p.detachView();        }    }}

Activity.java

public class LoginActivity extends BaseActivity implements IView {    @Override    protected LoginPresenter createPresenter() {        return new LoginPresenter();    }    @Override    protected int setMainLayout() {        return R.layout.login_main;    }    @Override    protected void initView() {        viewDataBinding.setOnClick(new OnViewClick());    }    @Override    protected void initBeforeData() {    }    @Override    public void showLoading(String msg) {        showToastShort(msg);    }    public class OnViewClick {        public void OnClickCommand(View view) {            switch (view.getId()) {                case R.id.btn_login:                    p.showLogin(viewDataBinding.etName.getText().toString(),viewDataBinding.etPwd.getText().toString());                    break;            }        }    }}

 效果图:

              

 

源码下载: https://github.com/DickyQie/android-databinding

 

总结:

  • 减少各层之间耦合,易于后续的需求变化,降低维护成本。

  • Presenter层独立于Android代码之外,可以进行Junit测试。

  • 接口和类较多,互相做回调,代码臃肿。

  • Presenter层与View层是通过接口进行交互的,接口粒度不好控制。

 

有不足之处,望指正

更多相关文章

  1. Android(安卓)通过接口的方式去调用服务里面的方法
  2. android实现事件监听的2种常用方式
  3. Watchdog 工作机制解析
  4. android传送照片到FTP服务器
  5. Android获取Mac地址
  6. Android中intent如何传递自定义数据类型
  7. android之横向滚动图
  8. 使用Android中的Parcelable序列化对象
  9. Android(安卓)launcher -- launcher源码修改 1

随机推荐

  1. Android(安卓)设置秒开全屏启动屏
  2. 完美解决Error:Execution failed for tas
  3. android事件处理的四种写法--电话拨号为
  4. Android中使用字体文件
  5. android的sqlite数据库中单引号的诡异作
  6. Android工具类ImgUtil选择相机和系统相册
  7. Android(安卓)LoadingDialog一些问题
  8. Android折线图开发之Achartnegine
  9. CoordinatorLayout高级用法-自定义Behavi
  10. Android(安卓)逐帧动画创建实例详解