android -------- MVP+DataBinding 的使用
今天来说说MVP+DataBinding 的使用
以一个登录案例来讲解
布局:(ConstraintLayout 作为根布局)
<layout> <data> <variable
name="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"> <TextView
android: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" /> <EditText
android: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" /> <TextView
android: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" /> <EditText
android: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" /> <Button
android: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; @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<LoginMainBinding,IView,LoginPresenter> 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层是通过接口进行交互的,接口粒度不好控制。
有不足之处,望指正
android -------- MVP+DataBinding 的使用的更多相关文章
- Android MVP+Retrofit+RxJava实践小结
关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...
- [Android]Android MVP&依赖注入&单元测试
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...
- Android MVP + 泛型,实现了友好VP交互及Activity潜在的内存泄露的优化
Android MVP粗来已经有段时间了,在项目中我也多多少少用了一些,不得不说代码使用这种模式后,条例确实清晰了好多,整个流程看起来有点各司其职的感觉(另一种的java面向对象的方式). 不过这里是 ...
- android MVP模式介绍与实战
android MVP模式介绍与实战 描述 MVP模式是什么?MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数 ...
- Android MVP模式
转自http://segmentfault.com/blogs,转载请注明出处Android MVP Pattern Android MVP模式\[1\]也不是什么新鲜的东西了,我在自己的项目里也普遍 ...
- Android MVP模式 简单易懂的介绍方式
主要学习这位大神的博客:简而易懂 Android MVP模式 简单易懂的介绍方式 https://segmentfault.com/a/1190000003927200
- 结合实例分析Android MVP的实现
最近阅读项目的源码,发现项目中有MVP的痕迹,但是自己却不能很好地理解相关的代码实现逻辑.主要原因是自己对于MVP的理解过于概念话,还没有真正操作过.本文打算分析一个MVP的简单实例,帮助自己更好的理 ...
- 浅谈Android MVP
什么是MVP MVP,全称 Model-View-Presenter.要说MVP那就不得不说一说它的前辈--MVC(Model-View-Controller,模型-视图-控制器). View:对应于 ...
- Android MVP模式简单易懂的介绍方式 (三)
Android MVP模式简单易懂的介绍方式 (一) Android MVP模式简单易懂的介绍方式 (二) Android MVP模式简单易懂的介绍方式 (三) 讲完M和P,接下来就要讲V了.View ...
随机推荐
- python逻辑运算符规则
逻辑运算符:or and not 优先级:()>not>and>or 举例子: Print(2>1 and 1<4 or 2<3 and 9>6 or 2&l ...
- iptables精通
前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发. iptables实现防火墙功能 ...
- 关于 Shell 的相关概念和配置方法,全在这儿了!
使用Linux的过程中少不了使用各种各样的Shell, 而根据启动环境的不同,Shell会读取不同的配置文件.本文便来详细介绍这些不同名字的配置文件在何时会被Shell读取. 什么是 Shell Sh ...
- spring-boot 速成(2) devtools之热部署及LiveReload
JRebel热部署插件相信很多人都知道,但是这是一款商业插件,spring-boot框架也提供了类似的功能,即:devtools,关键是免费的! 使用方法如下: 一.添加 devtools依赖 dep ...
- 57.搭建Vue环境
nodejs官网http://nodejs.cn/下载安装包,无特殊要求可本地傻瓜式安装,这里选择2017-5-2发布的 v6.10.3 cmd命令行: node -v //显示node版本 v6.1 ...
- laravel----------laravel5.3调度任务以及Artisan
1.在使用的过程中会遇到有些函数不能用需要在php配置文件里面打开: disable_functions = exec,passthru,popen,proc_open,shell_exec,syst ...
- 使用Navicat定时备份mysql数据库和创建报表并邮件自动发送
数据库备份在现代计算机高速发展的今日变得日益重要,程序员往往因为不重视而忽略备份数据,导致数据丢失,造成非常严重的后果.定时备份无疑是解决备份的最好的途径,本文主要使用Navicat来自动备份数据库和 ...
- LinQ各种方式查询、组合查询、IQueryable集合类型
1.模糊查询(包含) Repeater1.DataSource = con.car.Where(r =>r.name.Contains(s)).ToList(); 2.开头查询 Repeater ...
- mysql 分组取最新的一条记录(整条记录)
方法:mysql取分组后最新的一条记录,下面两种方法.一种是先筛选 出最大和最新的时间,在连表查询.一种是先排序,然后在次分组查询(默认第一条),就是最新的一条数据了 #select * from ...
- Javascript 面向对象编程2:构造函数的继承
这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例.对象之间的"继承"的五种方法.比如,现在有一个"动物"对象 ...