今天来说说MVP+DataBinding 的使用

以一个登录案例来讲解

布局:(ConstraintLayout 作为根布局)

<layout><data><variablename="onClick"type="com.zhangqie.mvplogin.LoginActivity.OnViewClick" /></data><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".LoginActivity"><TextViewandroid:id="@+id/tv1"android:layout_width="wrap_content"android:layout_height="45dp"android:gravity="center"android:text="账号:"android:textColor="@android:color/black"android:textSize="16dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintHorizontal_bias="0.2"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.4" /><EditTextandroid:id="@+id/et_name"android:layout_width="222dp"android:layout_height="45dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toRightOf="@+id/tv1"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.4" /><TextViewandroid:id="@+id/tv2"android:layout_width="wrap_content"android:layout_height="45dp"android:gravity="center"android:text="密码:"android:textColor="@android:color/black"android:textSize="16dp"app:layout_constraintHorizontal_bias="0.2"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toBottomOf="@+id/tv1" /><EditTextandroid:id="@+id/et_pwd"android:layout_width="222dp"android:layout_height="45dp"app:layout_constraintLeft_toRightOf="@+id/tv2"app:layout_constraintTop_toBottomOf="@+id/et_name" /><Buttonandroid:id="@+id/btn_login"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="25dp"android:onClick="@{onClick.OnClickCommand}"android:text="登录"app:layout_constraintTop_toBottomOf="@+id/et_pwd" /></android.support.constraint.ConstraintLayout>
</layout>

BaseActivity.Java

public abstract class BaseActivity<D extends ViewDataBinding,V,T extends BasePresenter<V>> extends AppCompatActivity{protected D viewDataBinding;protected T p;@Overrideprotected 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);}@Overrideprotected void onDestroy() {super.onDestroy();if (p != null){p.detachView();}}}

Activity.java

public class LoginActivity extends BaseActivity<LoginMainBinding,IView,LoginPresenter> implements IView {@Overrideprotected LoginPresenter createPresenter() {return new LoginPresenter();}@Overrideprotected int setMainLayout() {return R.layout.login_main;}@Overrideprotected void initView() {viewDataBinding.setOnClick(new OnViewClick());}@Overrideprotected void initBeforeData() {}@Overridepublic 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层是通过接口进行交互的,接口粒度不好控制。

有不足之处,望指正

转载于:https://www.cnblogs.com/zhangqie/p/9779302.html

android -------- MVP+DataBinding 的使用相关推荐

  1. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  2. Android MVP模式 简单易懂的介绍方式

    主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200 转载于:https://www ...

  3. Android MVP模式简单易懂的介绍方式 (一)

    Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 最近正在研究Android的MVP模式 ...

  4. Android MVP Presenter 中引发的空指针异常

    Android MVP Presenter 中引发的空指针异常 参考文章: (1)Android MVP Presenter 中引发的空指针异常 (2)https://www.cnblogs.com/ ...

  5. Android MVP和Dagger2

    In this tutorial, we'll be implementing MVP pattern along with Dagger2 in our Android Application. I ...

  6. Android MVP(三)内存泄漏分析与动态代理

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  7. Android MVP(四)运用反射配置泛型 Model

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  8. Android MVP 模式使用指南

    参考github代码:github 参考博客:Google 官方Android MVP架构实践 简单的以google官方代码和自己的demo记录Android的MVP设计模式. 1.官方MVP模式: ...

  9. Android MVP 详解(上)

    作者:李旺成 时间:2016年4月3日 "Android MVP 详解(下)"已经发布,欢迎大家提建议. MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点 ...

最新文章

  1. 带你3分钟学Python变量和数据类型
  2. 空间映射网络--Spatial Transformer Networks
  3. Permutation Sequence
  4. caj文件打不开显示内存不足_caj打开文件内存不足 cad内存不足一键修复
  5. No1_6.字符串的基本操作2_Java学习笔记
  6. 做大厂程序员是一种怎样的体验?这四位“百度程序员”说出了自己的看法!
  7. hive遍历_Hive解析流程-抽象语法树生成
  8. linux目录创立文件硬链接,在Linux中创建文件目录软链接、硬链接的方法
  9. Mac 应用开发--Cocoa运用程序显示或隐藏MainNemu
  10. zen brush 2 android,Zen Brush 2 才不仅仅是个练字 App 那么简单
  11. 华硕x205ta小本驱动下载页面
  12. 常用经典SQL语句大全完整版--详解+实例
  13. Til the Cows Come Home-Poj2387(最短路)
  14. 少男杀手dodolook签约酷6网原创红人阵营
  15. 安卓手机格式化怎么弄_安卓手机怎么格式化 Android手机内存卡格式化方法
  16. 深大教学区Dr.com,实现校园网自动认证的请求
  17. 2021年英语四级作文
  18. STM32 keil5 报错:flash download failed-cortex M3解决方法
  19. Ubuntu-第一次安装Ubuntu在笔记本及一些远程软件的安装
  20. ESP8266-Arduino编程实例-MS5611气压传感器驱动

热门文章

  1. S/4HANA业务角色概览之订单到收款篇
  2. 一步步在Docker里运行Web应用
  3. SAP CRM 和 Cloud for Customer 的 Document flow API 介绍
  4. oracle 游标循环 while,Oracle的游标使用方法 三种循环
  5. python 两点之间的距离_手把手教你HTML5实现根据LBS定位到商家两点之间距离多少...
  6. alpine linux安装ftp,如何在Alpine Linux上安装GLPK?
  7. Tomcat启动报内存溢出错误解决(两种)
  8. mysql主主 主键冲突_mysql主从复制原理,主主复制时主键冲突解决
  9. stm32 带通滤波器_带通滤波 - 基于STM32芯片和TFT-LCD的便携式心电图仪设计
  10. java在线用户查看_java Session统计在线用户,并且显示在线用户