Android MVVM小结
一、概念
关于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小结的更多相关文章
- Android MVVM框架RoboBinding初探
RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.MVVM模式是MVC模式的重要更新,使得项目结构更加的优美,易于维护以及方便 ...
- 如何构建Android MVVM 应用框架
概述 说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架.然而两者的概念是不一样的,不能混为一谈.MVVM是一种架构模式,而DataBinding是 ...
- android MVVM(1)用LiveData关联VM 与 V
1.官方文档 MVVM 官方文档: https://developer.android.com/jetpack/docs/guide ViewModel 文档: https://developer.a ...
- Android开发利器之Data Binding Compiler V2 —— 搭建Android MVVM完全体的基础
原创声明: 该文章为原创文章,未经博主同意严禁转载. 前言: Android常用的架构有:MVC.MVP.MVVM,而MVVM是唯一一个官方提供支持组件的架构,我们可以通过Android lifecy ...
- android mvvm初探
目前google的databinding library还处在rc版,其中编译器发挥了主要作用.目前也只是在android studio开发环境中支持. mvvm能够大大降低模块间的耦合度,在开发过程 ...
- android基础小结
(注:此小结文档在全屏模式下观看效果最佳) 2016年3月1日,正式开始了我的android学习之路. 最最开始的,当然是学习怎样搭载环境了,然而苦逼的我在win10各种坑爹的指引下还是安装了一个星期 ...
- Android技巧小结之新旧版本Notification
最近开发用到了通知功能,但有几个地方老是提示deprecated,然后就找了篇文章学习了下新旧版本的不同. Notification即通知,用于在通知栏显示提示信息. 在较新的版本中(API leve ...
- android MVVM(2)用数据绑定关联VM 与 V
1.官方文档 https://developer.android.com/topic/libraries/data-binding/architecture 2.简介 数据绑定库 可与MVVM 架构组 ...
- android mvvm
android studio 需要gradle 1.5.0以上才支持 dependencies { classpath 'com.android.tools.build:gradle:1.5.0'} ...
随机推荐
- 关于js的值传递和引用传递
最近在弄一个东西,明明就很简单的.不知道为啥有个坑,双向绑定,不过当有个数组为空时,它不会发送空的数组,而是不发送.这就坑爹了.导致老是删不掉. 处理了下,改成验证为空时,发送'[]‘字符串.成功.但 ...
- WAS域名解析问题
1.如果dmgr和his在一台机器上,但web服务器用的是app服务器 如下图: 插件都处理完成. 这时候,通过外网域名访问时,出现如下情况 或者 说明:ihs服务器上webserver1的文件Plu ...
- Sorting a Three-Valued Sequence
链接 分析:首先我们先对其进行排序,并看排序以后有多少个元素顺序是对的,接着我们看有多少个元素经过一次交换可以得到的,最后剩下的元素就是经过两次交换可以得到的了. /* PROB:sort3 ID:w ...
- 【NOIP2016】 组合数问题
[题目链接] 点击打开链接 [算法] 杨辉三角 + 二维前缀和 O(1)计算答案 [代码] #include<bits/stdc++.h> using namespace std; #de ...
- 高可用性和PyMongo
High Availability and PyMongo高可用性和PyMongo************************************ PyMongo makes it e ...
- JAVA 布局控制
在Java里该方法是安一个组件到一个窗体中去,它不同我们使用过的其它GUI系统.首先,它是全代码的:没有控制安放组件的“资源”.其次,该方法的组件被安放到一个被“布局管理器”控制的窗体中,由“布局管理 ...
- 量子纠缠2——CHSH不等式
问题 有Alice和Bob两个人,随机给他们两个数x和y(0或1),然后A和B根据他们得到数(x和y)给两个个数a和b(0或1). 规则如下: 如果输入的x和y都是1,那么,Alice和Bob给出不一 ...
- Start Developing Mac Apps -- Mac App Store Mac 应用商店
Mac App Store The information you’ve read so far focused on how to create an app in Xcode. However ...
- k8s-部署dashboard1.10.1-十七
一.获取镜像和填坑 我的k8s是1.13.1,这里dashboard用的1.10.1: 由于国内不能访问Google,而且大部分人可能也没有其他途径访问:只能在阿里云或者其他镜像网站上获取了: 镜像获 ...
- CodeForces 712A Memory and Crow (水题)
题意:有一个序列,然后对每一个进行ai = bi - bi + 1 + bi + 2 - bi + 3.... 的操作,最后得到了a 序列,给定 a 序列,求原序列. 析:很容易看出来,bi = ai ...