介绍

MVVM,Model-View-ViewModel,与上次讲的MVP模式比较的类似,MVP中需要大量的接口文件,而MVVM模式下,View和ViewModel直接关联,使用上比较方便,简化了代码,大致的结构图如下:

可以看待View和ViewModel是双向的交互,这一点很关键

DataBinding

Data Binding Library是Google推出的,可以说是针对MVVM模式的支持库,通过在Layout中进行数据的访问,来实现View和Data的双向绑定。不仅使用灵活,用法丰富,而且支持也是相当的广泛,很大程度上降低了代码量和耦合性,减少了开发者的压力。

build.gradle

    dataBinding {
enabled= true
}

这样使用比较的方法,当然这个需要当前的Gradle版本支持这个属性

Layout Data

<?xml version="1.0" encoding="utf-8"?>
<layout 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">
<data>
<import type="com.example.mraz.mvvmdemo.Model.User"></import>
<variable
name="user"
type="User">
</variable>
</data>
<LinearLayout ...
</LinearLayout>
</layout>

最完成使用Layout属性,通过data属性值,添加需要在布局文件中使用的变量和对应的变量类型,也可以先import文件,然后直接使用,不然就需要在type中使用类型的完整路径,当遇到相同的类名的时候,DataBinding支持别名的定义,alias

Layout Access Data

布局文件文件中如何实现对绑定数据的访问

                <TextView
android:id="@+id/tv_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.getUsername()}" /> <TextView
android:id="@+id/tv_password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.getPassword()}" />

使用格式为“@{ }”,大括号中的使用方式与代码中的基本无差别,可以使用方法,也可以使用对应的成员变量,当然如果权限允许的话,如果要直接访问private变量或者方法,显然是不现实的。

Activity Set Data

public class MainActivity extends AppCompatActivity {
User user = new User("", "");
@Bind(R.id.et_username)
EditText etUsername;
@Bind(R.id.et_password)
EditText etPassword;
@Bind(R.id.tv_username)
TextView tvUsername;
@Bind(R.id.tv_password)
TextView tvPassword; ActivityMainBinding activityMainBinding; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
ButterKnife.bind(this);
} @OnTextChanged(value = R.id.et_username, callback = OnTextChanged.Callback.TEXT_CHANGED)
void onUserNameChanged(CharSequence s,int start,int before,int count) {
user.setUsername(s.toString());
activityMainBinding.setUser(user);
} @OnTextChanged(value = R.id.et_password, callback = OnTextChanged.Callback.TEXT_CHANGED)
void onPasswordChangedps(CharSequence s,int start,int before,int count) {
user.setPassword(s.toString());
activityMainBinding.setUser(user);
} }

几个关键点:

1. ActivityMainBinding activityMainBinding

这里定义的变量类型ActivityMainBinding 与布局文件对应

activity_main ——-> ActivityMainBinding

first_second ——-> FirstSecondingBinding

Binding类的命名是基于所述layout文件的名称,用大写开头,除去下划线()以及()后的第一个字母大写,然后添加“Binding”后缀。这个类将被放置在一个模块封装包里的databinding封装包下

Binding类可通过调整data元素中的class属性来重命名或放置在不同的包中。例如:

<data class="UserBinding">
...
</data>

2.activityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

获取ActivityMainBinding对象,用于后面设置变量

3. activityMainBinding.setUser(user);

设置数据,User变量

表达式

常用的表达式和正常的java代码比较类似

- 数学 + - / * %

- 字符串连接 +

- 逻辑 && ||

- 二进制 & | ^

- 一元运算 + - ! ~

- 移位 >> >>> <<

- 比较 == > < >= <=

- instanceof

- 分组 ()

- null

- Cast

- 方法调用

- 数据访问 []

- 三元运算 ?:

不支持的操作:

this

super

new

显式泛型调用

实际效果图

备注:

关于DataBinding,这里有一篇文章讲得很清晰,推荐一下

https://segmentfault.com/a/1190000002876984

效果图对应的代码贴了一部分,实现相对比较容易,这里就不赘述了,如果有需要的留言,我再附上。

<Android 基础(五)> MVVM的更多相关文章

  1. <Android基础> (五) 广播机制

    1)接收系统广播:a.动态注册监听网络变化 b.静态注册实现开机启动 2)发送自定义广播:a.发送标准广播 b.发送有序广播 3)使用本地广播 第五章 5.1 广播机制 Android中的每个程序都可 ...

  2. Android基础(五) Service全解析----看不见的Activity

    一.服务的介绍: 作为Android四大组件之中的一个,Service(服务)也常常运用于我们的日常使用中,它与Activity的差别在于:Service一直在后台执行.没实用户界面.所以绝不会到前台 ...

  3. Android基础夯实--重温动画(五)之属性动画 ObjectAnimator详解

    只有一种真正的英雄主义 一.摘要 ObjectAnimator是ValueAnimator的子类,它和ValueAnimator一样,同样具有计算属性值的功能,但对比ValueAnimator,它会更 ...

  4. android基础---->JSON数据的解析

    上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...

  5. 基础4 Android基础

    基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...

  6. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  7. android基础---->service的生命周期

    服务是一个应用程序组件代表应用程序执行一个长时间操作的行为,虽然不与用户交互或供应功能供其它应用程序使用.它和其他的应用对象一样,在他的宿主进程的主线程中运行.今天我们开始android中普通serv ...

  8. android基础---->XMl数据的解析

    在网络上传输数据时最常用的格式有两种,XML和JSON,下面首先学一下如何解析XML格式的数据,JSON的解析可以参见我的博客(android基础---->JSON数据的解析).解析XML 格式 ...

  9. Android基础工具类重构系列一Toast

    前言: 一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经. 本系列定位Android基础工具类重构.旨在记录实际项目中经经常使用到的一些工具类,比方Toas ...

  10. android基础---->DiskLruCache的使用及原理

    DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,今天我们开始对于DiskLruCache的学习.DiskLruCache的测试代码:DiskLruCache的测试代码下载.关于FidkLru ...

随机推荐

  1. 使用CocoaLumberjack时,自定义的log文件名

    CocoaLumberjack是一个功能丰富的第三方日志系统.其生成的log文件,默认是自动命名的,如果需要自定义文件名,重载两个函数即可. // Log.h#import "CocoaLu ...

  2. Java基础 -- 泛型之泛型参数

    泛型机制常用的参数有3个: “?”代表任意类型.如果只指定了<?>,而没有extends,则默认是允许任意类. extends关键字声明了类型的上界,表示参数化的类型可能是所指定的类型,或 ...

  3. 【OpenGL】Shader概述

    目录(?)[-] 综述 编译一个Shader 链接一个Shader 删除一个Shader 指定使用一个Shader Program 删除一个Shader Program 备注 这篇文章讲述了Shade ...

  4. python 里 np.array 的shape (2,)与(2,1)的分别是什么意思,区别是什么?

    numpy.ndarray.shap是返回一个数组维度的元组. (2,)与(2,1)的区别如下:   ndarray.shape:数组的维度.为一个表示数组在每个维度上大小的整数元组.例如二维数组中, ...

  5. 机器学习十大算法之EM算法

    此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于目前论坛的Markdown不支持Mathjax,数学公式没法正常识别,文章只能用截图上传了...     ...

  6. 在Android中使用FlatBuffers(下篇)

    本文来自网易云社区. FlatBuffers编码数组 编码数组的过程如下: 先执行 startVector(),这个方法会记录数组的长度,处理元素的对齐,准备足够的空间,并设置nested,用于指示记 ...

  7. SpringBoot第六篇:整合通用Mapper

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10876339.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言   在以往的项 ...

  8. 【leetcode 105. 从前序与中序遍历序列构造二叉树】解题报告

    前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树 TreeNode* build(vector<int>& preorder, int l1, int r1, vecto ...

  9. KONG 安装 (在 CentOS 7 中)

    1. 下载安装包:  https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong ...

  10. heap 堆

    实现了交换.向上维护,向下维护的原子功能,其它插入.删除.修改的功能应该不在话下. 于是有了代码:(luogu3378模板题) // luogu-judger-enable-o2 #include & ...