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'} ...
随机推荐
- Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.st.mapper.UserMapper.userBaseMap
mybatis出现此异常,可能是因为 ***Mapper.xml 文件中存在重名对象,一不小心重复启动了mybatis的逆向工程. 以为会覆盖掉以前生成的,没想到是新生成的和之前生成的重复了 解决:把 ...
- android之View坐标系(view获取自身坐标的方法和点击事件中坐标的获取)
在做一个view背景特效的时候被坐标的各个获取方法搞晕了,几篇抄来抄去的博客也没弄很清楚. 现在把整个总结一下. 其实只要把下面这张图看明白就没问题了. 涉及到的方法一共有下面几个: view获取自身 ...
- JRE System Library 与Java EE Libraries的区别
JRE System Library是只要做java开发都需要的完整的.标准的库. Java EE5 Libraries只是java三个方向中做java EE所需要的库.如果做Web方面的开发的话就 ...
- codeforces 691B B. s-palindrome(水题)
题目链接: B. s-palindrome 题意: 问给定的字符串是否是镜面对称; 思路: 直接看哪些字母是镜面对称的就行: AC代码: //#include <bits/stdc++.h> ...
- OpenCV——PS滤镜算法之 Ellipsoid (凸出)
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- margin和padidng的使用
何时应当使用margin:需要在border外侧添加空白时.空白处不需要背景(色)时.上下相连的两个盒子之间的空白,需要相互抵消时.如15px + 20px的margin,将得到20px的空白. 何时 ...
- python之路,day6-面向对象
一.面向过程编程 简单的说就是:如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,但是如果你要处理的任务比较复杂,且需要不断迭代和维护的,那还是用面向对象最方便了. 二.面向对 ...
- bzoj4773
矩阵乘法 ...爆零了... 想到Floyd,却不知道怎么限制点数... 其实我们只要给Floyd加一维,dp[i][j][k]表示当前走过了i个点,从j到k的最短距离,然后这样可以倍增,最后看是否有 ...
- C++初学(1) 简单的加减乘除取余运算代码
//---------------+-*/%算法---------------------------------------------------------- #include <iost ...
- 6-13 Hog特征1
Hog特征与Haar特征有点不同,Hog特征是直接经过模板计算得到的