一、概念

关于MVC、MVP与MVVM的概念就不介绍了,总之一句话,MVVM概念出现比MVP早,MVP比MVC早,作为程序员就应该去学习最新的技术不是?详细的概念介绍移步这里吧,https://www.jianshu.com/p/4830912f5162

二、MVVM的使用办法

第一步:在工程的build.gradle中配置

     dataBinding{
enabled = true
}

第二步:修改布局文件,记得布局文件一定要用layout标签给括起来,下面先把布局文件都贴出来

 <?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:bind="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"> <data>
<variable
name="user"
type="com.plbear.doncal.rxjavademo.User"></variable> <variable
name="clickHandler"
type="com.plbear.doncal.rxjavademo.MainActivity.ClickHandler"></variable>
</data> <android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"> <TextView
android:id="@+id/lab_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="63dp"
android:layout_marginStart="63dp"
android:layout_marginTop="46dp"
android:text="@{user.name}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" /> <Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="63dp"
android:layout_marginStart="63dp"
android:layout_marginTop="26dp"
android:onClick="@{clickHandler.btnClickHandler}"
android:text="Button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> <TextView
android:id="@+id/lab_passwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="28dp"
android:text="@{user.passwd}"
app:layout_constraintStart_toStartOf="@+id/lab_name"
app:layout_constraintTop_toBottomOf="@+id/lab_name" /> </android.support.constraint.ConstraintLayout>
</layout>

从这个布局文件中,我们看到定义了两个变量,分别是user和clickHandler,其中,在两个TextView文件中,分别用以下的办法来来使用:

 android:text="@{user.name}"
 android:onClick="@{clickHandler.btnClickHandler}"

第二步:Java文件的修改

新增一个User数据类

 public class User {
public ObservableField<String> name = new ObservableField<>();
public ObservableField<String> passwd = new ObservableField<>();
}

MainActivity的代码及解释如下:

 package com.plbear.doncal.rxjavademo;

 import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View; import com.plbear.doncal.rxjavademo.databinding.ActivityMainBinding; public class MainActivity extends AppCompatActivity {
ActivityMainBinding binding; //自动生成ActivityMainBinding类,命名规则是布局文件使用驼峰规则来命名
final User mUser = new User(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
mUser.name.set("plbear"); //修改变量
mUser.passwd.set("123456");
binding.setUser(mUser);//设置layout文件中的user值
// binding.setClickHandler(new ClickHandler());//2.设置layout文件中的clickHandler值
binding.button.setOnClickListener(v ->{
mUser.passwd.set("change name too"); //1.可以用这种方式设置点击事件,点击后password被设置为change name too
});
} //2.也可以用这种方式设置点击事件,点击之后,name控件中的值变为 change name
//设置前需要在前面设置binding.setClickHandler
// public class ClickHandler{
// public View.OnClickListener btnClickHandler = v -> {
// mUser.name.set("change name");
// };
// }
}

三、换一种实现

前面利用ObservableFiled来实现,这种实现方式比较适合于细粒度的实现,但是一旦大量的数据都是通过MVVM的方式来做,这种实现显然是不合时宜的。那就再找一种数据类的实现方式:

 package com.plbear.doncal.rxjavademo;

 import android.databinding.BaseObservable;
import android.databinding.Bindable;
import android.databinding.ObservableField; public class User extends BaseObservable{
@Bindable
private String name; @Bindable
private String passwd; public void setPasswd(String passwd){
this.passwd = passwd;
notifyPropertyChanged(BR.passwd);
} public void setName(String name){
this.name = name;
notifyPropertyChanged(BR.name);
} public String getName(){
return this.name;
} public String getPasswd(){
return this.passwd;
}
}

这里有两个坑需要注意下:


  • Bindable标签,这个标签可以用在变量上面,也可以用在getName和getPasswd上面
  • notifyPropertyChanged的时候,一定要通知到Br.passwd,而不是BR.user

Android MVVM小结的更多相关文章

  1. Android MVVM框架RoboBinding初探

    RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.MVVM模式是MVC模式的重要更新,使得项目结构更加的优美,易于维护以及方便 ...

  2. 如何构建Android MVVM 应用框架

    概述 说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架.然而两者的概念是不一样的,不能混为一谈.MVVM是一种架构模式,而DataBinding是 ...

  3. android MVVM(1)用LiveData关联VM 与 V

    1.官方文档 MVVM 官方文档: https://developer.android.com/jetpack/docs/guide ViewModel 文档: https://developer.a ...

  4. Android开发利器之Data Binding Compiler V2 —— 搭建Android MVVM完全体的基础

    原创声明: 该文章为原创文章,未经博主同意严禁转载. 前言: Android常用的架构有:MVC.MVP.MVVM,而MVVM是唯一一个官方提供支持组件的架构,我们可以通过Android lifecy ...

  5. android mvvm初探

    目前google的databinding library还处在rc版,其中编译器发挥了主要作用.目前也只是在android studio开发环境中支持. mvvm能够大大降低模块间的耦合度,在开发过程 ...

  6. android基础小结

    (注:此小结文档在全屏模式下观看效果最佳) 2016年3月1日,正式开始了我的android学习之路. 最最开始的,当然是学习怎样搭载环境了,然而苦逼的我在win10各种坑爹的指引下还是安装了一个星期 ...

  7. Android技巧小结之新旧版本Notification

    最近开发用到了通知功能,但有几个地方老是提示deprecated,然后就找了篇文章学习了下新旧版本的不同. Notification即通知,用于在通知栏显示提示信息. 在较新的版本中(API leve ...

  8. android MVVM(2)用数据绑定关联VM 与 V

    1.官方文档 https://developer.android.com/topic/libraries/data-binding/architecture 2.简介 数据绑定库 可与MVVM 架构组 ...

  9. android mvvm

    android studio 需要gradle 1.5.0以上才支持 dependencies { classpath 'com.android.tools.build:gradle:1.5.0'} ...

随机推荐

  1. 添加.pch文件

    完成框架, .pch文件 1.创建.pch文件 2.配置.pch文件 双击,改成:项目名/pch文件名

  2. bzoj4557 [JLoi2016]侦察守卫——DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 见这位的博客:https://www.cnblogs.com/Narh/p/91403 ...

  3. JNI 接口规范

    1. 简介 Java 本地接口概述 背景 JDK 1.0 本地方法接口 Java 运行时接口 原始本地接口和 Java/COM 接口 目标 Java 本地接口方法 利用 JNI 编程 JDK 1.1. ...

  4. FINDSTR 命令使用详解

    Findstr 使用正则表达式搜索文件中的文本模式. 语法 findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/p] [/ ...

  5. Codechef LOCAUG17

    做完题目很少有写题解的习惯,强行PO一组吧. 比赛链接:https://www.codechef.com/LOCAUG17 PRINCESS 给定字符串s,问s是否存在长度大于1的回文子串. 解:分两 ...

  6. In-App Purchase Programming Guide----(二) ---- Designing Your App’s Products

    Designing Your App’s Products A product is something you want to sell in your app’s store. You creat ...

  7. 038--HTML

    一.HTML的定义 1. 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 2. 浏览器按顺序渲染网 ...

  8. ccflow_002.表单引擎与流程引擎的关系

    本节主要内容 表单.数据.流程引擎的关系 图形展示三者之间的关系 流程编号和节点编号命名规则 这里的206就是这个流程的编号 2601:01就是当前节点的编号 流程编号206转换为int类型之后加上0 ...

  9. E20170403-gg

    thumbnail 缩略图 inherit     vt. 继承; vt. 经遗传获得(品质.身体特征等),继任; opacity 不透明度   flat     adj. 平的; 单调的; 不景气的 ...

  10. hdoj2952【DFS联通块】

    我觉得还是这种不带回溯的直接搜到底的好玩啊!!!但是要注意边界,记得以前四周要空出来的一道题目,被坑了很久,还是wa到比赛结束!!!这道还是基础题 类似的基础题:POJ1562 hdoj1016 po ...